package com.quantum.php.wizards;

import java.text.MessageFormat;

import org.eclipse.jface.preference.IPreferenceStore;
import org.eclipse.swt.SWT;
import org.eclipse.swt.dnd.TextTransfer;
import org.eclipse.swt.dnd.Transfer;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;

import com.quantum.QuantumPlugin;
import com.quantum.adapters.DatabaseAdapter;
import com.quantum.model.Bookmark;
import com.quantum.model.Column;
import com.quantum.model.Entity;
import com.quantum.php.PHPMessages;
import com.quantum.wizards.BaseSQLPage;
import com.quantum.wizards.SQLPage;

public class PHPUpdateRowPage extends BaseSQLPage implements SQLPage {
	String[] columnNames;
	Text[] oldValues;
	Text[] newValues;
	Button[] primaryKeys;
	Button[] setValues;
	Label query;
	IPreferenceStore fStore;
	public PHPUpdateRowPage(String pageName) {
		super(pageName);
	}

	public void createControl(Composite parent) {
		System.out.println("page create control"); //$NON-NLS-1$
		Composite container = new Composite(parent, SWT.V_SCROLL);
		fStore = QuantumPlugin.getDefault().getPreferenceStore();
		GridLayout layout = new GridLayout();
		container.setLayout(layout);
		Entity entity = this.results.getEntity();
		
		int layoutColumns = 5;
		layout.numColumns = layoutColumns;

		columnNames = this.results.getColumnNames();
		oldValues = new Text[columnNames.length];
		newValues = new Text[columnNames.length];
		primaryKeys = new Button[columnNames.length];
		setValues = new Button[columnNames.length];
		Label temp = new Label(container, SWT.NULL);
		temp.setText(PHPMessages.getString("PHPUpdateRowPage.ColumnName")); //$NON-NLS-1$
		temp = new Label(container, SWT.NULL);
		temp.setText(PHPMessages.getString("PHPUpdateRowPage.OldValue")); //$NON-NLS-1$
		temp = new Label(container, SWT.NULL);
		temp.setText(""); //$NON-NLS-1$
		temp = new Label(container, SWT.NULL);
		temp.setText(PHPMessages.getString("PHPUpdateRowPage.NewValue")); //$NON-NLS-1$
		temp = new Label(container, SWT.NULL);
		temp.setText(PHPMessages.getString("PHPUpdateRowPage._13")); //$NON-NLS-1$
		for (int i = 0; i < columnNames.length; i++) {
			Label label = new Label(container, SWT.NULL);
			label.setText(columnNames[i]);
			oldValues[i] = new Text(container, SWT.BORDER | SWT.SINGLE);
			GridData gridData = new GridData();
			gridData.widthHint = 100;
			oldValues[i].setLayoutData(gridData);
			Object data = this.row == null ? null : this.row.get(i+1);
			oldValues[i].setText(data == null ? "" : '$'+columnNames[i]);
			oldValues[i].addModifyListener(new ModifyListener() {
				public void modifyText(ModifyEvent e) {
					updateQuery();
				}				
			});
			primaryKeys[i] = new Button(container, SWT.CHECK);
			primaryKeys[i].setText("Where"); //$NON-NLS-1$
			Column column = (entity == null) ? null : getColumn(entity, columnNames[i]);
			if (column != null && column.isPrimaryKey()) 
				primaryKeys[i].setSelection(true);
    			primaryKeys[i].addSelectionListener(new SelectionListener() {
    				public void widgetDefaultSelected(SelectionEvent e) {
    				}
    				public void widgetSelected(SelectionEvent e) {
    					updateQuery();
    				}
			});
			newValues[i] = new Text(container, SWT.BORDER | SWT.SINGLE);
			newValues[i].setText(data == null ? "" : '$'+columnNames[i]);
			gridData = new GridData();
			gridData.widthHint = 100;
			newValues[i].setLayoutData(gridData);
			newValues[i].addModifyListener(new ModifyListener() {
				public void modifyText(ModifyEvent e) {
					updateQuery();
				}				
			});
			setValues[i] = new Button(container, SWT.CHECK);
			setValues[i].setText(PHPMessages.getString("PHPUpdateRowPage.SetValue")); //$NON-NLS-1$
			setValues[i].addSelectionListener(new SelectionListener() {
				public void widgetDefaultSelected(SelectionEvent e) {
				}
				public void widgetSelected(SelectionEvent e) {
					updateQuery();
				}
			});
		}
		query = new Label(container, SWT.WRAP | SWT.V_SCROLL);
 		GridData gridData = new GridData();
 		gridData.horizontalSpan = layoutColumns;
		gridData.horizontalAlignment = GridData.FILL;
		gridData.verticalAlignment = GridData.FILL;
		gridData.grabExcessHorizontalSpace = true;
		gridData.grabExcessVerticalSpace = true;
		query.setLayoutData(gridData);

 		setControl(container);
        updateQuery();
       
		setPageComplete(true);
	}
	public void updateQuery() {
		System.out.println("Updating query"); //$NON-NLS-1$
		StringBuffer setClause = new StringBuffer();
		StringBuffer whereClause = new StringBuffer();
		Bookmark bookmark = this.results.getBookmark();
		Entity entity = this.results.getEntity();
		DatabaseAdapter adapter = bookmark.getAdapter();
		
		int numValuesSet = 0;
		int numValuesWhere = 0;
		for (int i = 0; i < columnNames.length; i++) {
			if (primaryKeys[i].getSelection()) {
				String value = oldValues[i].getText();
				if (numValuesWhere > 0) whereClause.append(" AND "); //$NON-NLS-1$
				whereClause.append("("); //$NON-NLS-1$
				whereClause.append(columnNames[i]);
				whereClause.append(" = "); //$NON-NLS-1$
                appendColumn(whereClause, entity, columnNames[i], adapter, value);
				whereClause.append(")"); //$NON-NLS-1$
				numValuesWhere++;
			} 
			if (setValues[i].getSelection()) {
				String value = newValues[i].getText();
				if (numValuesSet > 0) setClause.append(", "); //$NON-NLS-1$
				setClause.append(columnNames[i]);
				setClause.append(" = "); //$NON-NLS-1$
                appendColumn(setClause, entity, columnNames[i], adapter, value);
				numValuesSet++;
			}
		}
//		String query = "UPDATE " + this.results.getEntity().getQuotedTableName(); //$NON-NLS-1$
//		query += " SET " + setClause.toString(); //$NON-NLS-1$
//		query += " WHERE " + whereClause.toString(); //$NON-NLS-1$
//		
		String[] arguments = { this.results.getEntity().getQuotedTableName(), setClause.toString(), whereClause.toString()};
	    MessageFormat form = new MessageFormat(fStore.getString("phpeclipse.sql.update.template"));

	    String query = form.format(arguments);
	    this.query.setText(query);
	    
	}

    /* (non-Javadoc)
     * @see com.quantum.wizards.BaseSQLPage#getQueryText()
     */
    protected String getQueryText() {
        return query.getText();
    }

  /* (non-Javadoc)
   * @see com.quantum.wizards.SQLPage#performFinish()
   */
  public boolean performFinish() {
  	QuantumPlugin.getDefault().getSysClip().setContents(
			new Object[] { query.getText() },
			new Transfer[] { TextTransfer.getInstance()});
    return true;
  }
}