package com.metaweb.gridlock.commands;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


import com.metaweb.gridlock.expr.Evaluable;
import com.metaweb.gridlock.expr.Parser;
import com.metaweb.gridlock.history.CellChange;
import com.metaweb.gridlock.history.HistoryEntry;
import com.metaweb.gridlock.history.MassCellChange;
import com.metaweb.gridlock.model.Cell;
import com.metaweb.gridlock.model.Column;
import com.metaweb.gridlock.model.Project;
import com.metaweb.gridlock.model.Row;
import com.metaweb.gridlock.process.QuickHistoryEntryProcess;

public class DoTextTransformCommand extends Command {
	
	@Override
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
		Project project = getProject(request);
		int cellIndex = Integer.parseInt(request.getParameter("cell"));
		
		String columnName = null;
		for (Column column : project.columnModel.columns) {
			if (column.cellIndex == cellIndex) {
				columnName = column.headerLabel;
				break;
			}
		}
		
		String expression = request.getParameter("expression");
		
		try {
			Evaluable eval = new Parser(expression).getExpression();
			//System.out.println("--- " + eval.toString());
			Properties bindings = new Properties();
			bindings.put("project", project);
			
			List<CellChange> cellChanges = new ArrayList<CellChange>(project.rows.size());
			
			for (int r = 0; r < project.rows.size(); r++) {
				Row row = project.rows.get(r);
				if (cellIndex < row.cells.size()) {
					Cell cell = row.cells.get(cellIndex);
					if (cell.value == null) {
						continue;
					}
					
					bindings.put("cell", cell);
					bindings.put("value", cell.value);
					
					Cell newCell = new Cell();
					newCell.value = eval.evaluate(bindings);
					newCell.recon = cell.recon;
					
					CellChange cellChange = new CellChange(r, cellIndex, cell, newCell);
					cellChanges.add(cellChange);
				}
			}
			
			MassCellChange massCellChange = new MassCellChange(cellChanges);
			HistoryEntry historyEntry = new HistoryEntry(
				project, "Text transform on " + columnName + ": " + expression, massCellChange);
			
			boolean done = project.processManager.queueProcess(
					new QuickHistoryEntryProcess(project, historyEntry));
			
			respond(response, "{ \"code\" : " + (done ? "\"ok\"" : "\"pending\"") + " }");
			
		} catch (Exception e) {
			respondException(response, e);
		}
	}
}