package diploma;

import javax.swing.*;
import javax.swing.table.*;
import java.awt.*;
import java.awt.event.*;
import java.sql.*;
import java.io.*;
import java.util.*;
import java.text.SimpleDateFormat;


class ActualizareInregistrari extends JFrame implements ActionListener {
	EditManualPanel editManualPanel;
	StringBuffer updateString = new StringBuffer(""), updateHtmlString = new 
		StringBuffer("");
	WherePanel wherePanel;
	InterfataGrafica interfataGrafica;
	JTable updateTable;
	String nmTabString;
	private JButton updateButton, inchidButton;
	Hashtable<String, Atribute> arrayCpAtribHash;	//cp. tabelului
	boolean eroareSintaxa = false;
	
	public ActualizareInregistrari(InterfataGrafica interfataGrafica) {
		super("Actualizare înregistrări din tabel după criterii");
		this.interfataGrafica = interfataGrafica;
		editManualPanel = new EditManualPanel();
		editManualPanel.editManButton.addActionListener(this);
		wherePanel = new WherePanel(this, true);
		nmTabString = (String) interfataGrafica.intGrafList.getSelectedValue();

//umplem Nume câmp din tabelul where cu cp. din tabelul respectiv		
		ObjectInputStream objInStr = null;
		try {
			objInStr = new ObjectInputStream(
				new FileInputStream(interfataGrafica.numeBdString + 
				"\\" + nmTabString + ".txt"));
		}
		catch (FileNotFoundException fileExc) {fileExc.getMessage();}
		catch (IOException ioExc) {ioExc.getMessage();}
		TabelMysqlObj tabObj = null;
		try {
			tabObj = (TabelMysqlObj)objInStr.readObject();
			if (objInStr != null) objInStr.close();
		}
		catch (ClassNotFoundException classExc) {
			classExc.getMessage();
		}
		catch(IOException except) {except.getMessage();}
		if (tabObj == null) return;
		Vector<String> nmColVector = new Vector<String>();	//pt updateTable
//adăugăm toate cp. tabelului în lista de câmpuri din tabelul where
//și în lista de coloane din updateTable :
		arrayCpAtribHash = tabObj.getArrayCpAtribHash();
		for (Atribute atr : arrayCpAtribHash.values()) {
			String nmCp = atr.getProperty("numeCamp");
			wherePanel.numeCpCBoxModel.insertElementAt(
				nmTabString + "." + nmCp, 0);
			wherePanel.cpHash.put(nmTabString + "." + nmCp,
				atr.getProperty("tipCamp") + 
				((atr.getProperty("lungCamp").equals("no")) ?
				"" : "(" + atr.getProperty("lungCamp") + ")"));
			nmColVector.addElement(nmCp);
	
		}
		
		updateTable = new JTable(new DefaultTableModel(nmColVector, 0));
		updateTable.setPreferredScrollableViewportSize(new Dimension(
			600, 80));
		JScrollPane scrollPane = new JScrollPane(updateTable);
		//tooltip pt. fiec. coloană din updateTable cu tipul coloanei :
		for (int col = 0; col < nmColVector.size(); col++) {
			TableColumn colCrt = null;
			try {
				colCrt = updateTable.getColumnModel().getColumn(col);
			}
			catch (ArrayIndexOutOfBoundsException exc) {}
			String nmCol = updateTable.getColumnName(col);
			Atribute atr = arrayCpAtribHash.get(nmCol);
			if (atr != null) {
				DefaultTableCellRenderer dtcr = 
					new DefaultTableCellRenderer();
				dtcr.setToolTipText(atr.afisAtrib(true));
				if (colCrt != null)
					colCrt.setCellRenderer(dtcr);
			}
		}
		//Creează panelul cu butoanele finale ale tabelului
		JPanel butonPanel = new JPanel(new FlowLayout(FlowLayout.CENTER, 50, 10));
		updateButton = new JButton("Execută UPDATE");
		updateButton.setMnemonic(KeyEvent.VK_U);
		updateButton.addActionListener(this);
		inchidButton = new JButton("Închidere");
		inchidButton.setMnemonic(KeyEvent.VK_N);
		inchidButton.addActionListener(this);
		butonPanel.add(inchidButton);
		butonPanel.add(updateButton);
		//Panelul ce cuprinde tot
		JPanel reuniunePanel = new JPanel();
		reuniunePanel.setOpaque(true);
		reuniunePanel.setLayout(new BoxLayout(reuniunePanel, BoxLayout.Y_AXIS));
		reuniunePanel.add(editManualPanel);
		reuniunePanel.add(Box.createVerticalStrut(20));
		reuniunePanel.add(scrollPane);
		reuniunePanel.add(Box.createVerticalStrut(20));
		reuniunePanel.add(wherePanel);
		reuniunePanel.add(Box.createVerticalStrut(20));
		reuniunePanel.add(butonPanel);
		reuniunePanel.setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20)); 
		setContentPane(reuniunePanel);
		
		Vector<String> randGol = new Vector<String>();
		for (int i = 0; i < nmColVector.size(); i++)
			randGol.addElement("");
		((DefaultTableModel)updateTable.getModel()).addRow(randGol);

	}
	
	public void formareComanda() {
		String actualStr = "";		//lista cu coloane actualizate
		String actualHtmlStr = "";
		for (int i = 0; i < updateTable.getColumnCount(); i++) {
			String valCellStr = updateTable.getValueAt(0, i).toString();
			if (valCellStr.equals(""))
				continue;
		 	eroareSintaxa = false;
			String nmColStr = updateTable.getColumnName(i);
			String tipColStr = arrayCpAtribHash.get(nmColStr).getProperty(
				"tipCamp");
			Atribute atr = arrayCpAtribHash.get(nmColStr);
			boolean eNumar = false;
			try {
				if (tipColStr.startsWith("int")) {
					int val = Integer.parseInt(valCellStr); 	
	//JOptionPane.showMessageDialog(null, nmColCrt+"\n"+new Integer(val));
					eNumar = true;
				} 
				else if (tipColStr.startsWith("tinyint")) {
					byte val = Byte.parseByte(valCellStr); 	
					eNumar = true;	
				}
				else if (tipColStr.startsWith("smallint") || tipColStr.equals(
					"year")) {
					short val = Short.parseShort(valCellStr); 	
					eNumar = true;		
				} 	
				else if (tipColStr.startsWith("bigint")) {
					long val = Long.parseLong(valCellStr); 	
					eNumar = true;	
				} 	 	
				else if (tipColStr.startsWith("float")) {
					float val = Float.parseFloat(valCellStr); 	
					eNumar = true;	 	
				}
				else if (tipColStr.startsWith("double") || tipColStr.equals(
					"numeric")) {
					double val = Double.parseDouble(valCellStr); 	
					eNumar = true;		
				}
				else if (tipColStr.startsWith("date")) {
					SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
					java.util.Date val = sdf.parse(valCellStr); 	
				}
				else if (tipColStr.equals("time")) {
					SimpleDateFormat sdf = new SimpleDateFormat("hh:mm:ss");
					Time val = (Time) sdf.parse(valCellStr); 	
				}
				else if (tipColStr.startsWith("datetime")) {
					SimpleDateFormat sdf = new SimpleDateFormat(
						"yyyy-MM-dd hh:mm:ss");
					java.util.Date val = sdf.parse(valCellStr); 	 	
				}
				else if (tipColStr.startsWith("timestamp"))  {
					String format = "yyyyMMddhhmmss";
					if (! atr.getProperty("lungCamp").equals("no")) {
						int lung = Integer.parseInt(atr.getProperty(
							"lungCamp"));
						format = format.substring(0, lung);
					}
					SimpleDateFormat sdf = new SimpleDateFormat(format);
					java.util.Date val = sdf.parse(valCellStr); 	 	
				}
				else if (tipColStr.startsWith("enum(") || 
					tipColStr.startsWith("set(")) {
					String val = updateTable.getValueAt(0,
						i).toString();
					if (tipColStr.indexOf("(" + val + ", ") < 0 && 
						tipColStr.indexOf(", " + val + ", ") < 0 &&
						tipColStr.indexOf(", " + val + ")") < 0) {
						JOptionPane.showMessageDialog(null, "Nu este corect formatul"
					 	+ " din celula\n de pe rândul " + new Integer(1).toString() + 
					 	" \n și coloana " + new Integer(i + 1).toString(),
					 	"Atenție ! Eroare !", JOptionPane.ERROR_MESSAGE);
					 	eroareSintaxa = true;
					}
				}
			}
		    catch (Exception exc) {
			  JOptionPane.showMessageDialog(null, "Nu este corect formatul din  "
		 	  + "celula\n de pe rândul " + new Integer(1).toString() + 
		 	  " \n și coloana " + new Integer(i + 1).toString(),
		 	  "Atenție ! Eroare !", JOptionPane.ERROR_MESSAGE);
			  eroareSintaxa = true;
		    }
		    if (! eNumar)
		    	valCellStr = "\'" + valCellStr + "\'";
		    actualStr += nmColStr + "=" + valCellStr + ", ";
			actualHtmlStr += "<font color=\"red\">" + nmColStr + 
				"</font> = <font color=\"green\">" + valCellStr + "</font>, ";

		}
		if (actualStr.length() > 2)
			actualStr = actualStr.substring(0, actualStr.length() - 2);
		if (actualHtmlStr.length() > 2)
			actualHtmlStr = actualHtmlStr.substring(0, actualHtmlStr.length()
				- 2);
		updateString = new StringBuffer("UPDATE ");
		updateString = updateString.append(nmTabString + " SET "
			).append(actualStr).append(wherePanel.whereString);
		updateHtmlString = new StringBuffer("UPDATE ");
		updateHtmlString = updateHtmlString.append("<font color=\"red\">" + 
			nmTabString + "</font> SET ").append(actualHtmlStr).append(" "
			).append(wherePanel.whereHtmlString);
		editManualPanel.comandaEditorPane.setText(updateHtmlString.toString());
	}
	
	public void actionPerformed(ActionEvent e) {
		JButton src = (JButton) e.getSource();
		if (src == inchidButton)
			dispose();
		else if (src == editManualPanel.editManButton) {
			Toolkit.getDefaultToolkit().beep();
			int answ = JOptionPane.showConfirmDialog(this, 
				"Dacă decideți să editați comanda MYSQL, pierdeți suportul" +
				" oferit de interfața grafică.\nEditați comanda?", "Întrebare",
				JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);
			if (answ == JOptionPane.YES_OPTION) {
				JComponent[] compArray = {editManualPanel.editManButton, 
				updateTable, wherePanel.criteriiTable, wherePanel.exprAritmLabel, 
				wherePanel.exprAritmTxFld, wherePanel.validButton};
				for (JComponent compon : compArray) 
					compon.setEnabled(false);
				formareComanda();
				editManualPanel.comandaEditorPane.setEditable(true);
				editManualPanel.comandaEditorPane.setContentType("text/plain");
				editManualPanel.comandaEditorPane.setText(updateString.toString());
				editManualPanel.comandaEditorPane.requestFocusInWindow();
				
			}
		}
		else {
			String nmTab = (String)
				interfataGrafica.intGrafList.getSelectedValue();
			wherePanel.validButton.doClick();
			if (wherePanel.eroareSintaxa || eroareSintaxa)
				return;
			try {
				Statement s_ment = interfataGrafica.conex.createStatement();
				s_ment.executeUpdate(updateString.toString());
				dispose();
			}
			catch (SQLException exc) {
				JOptionPane.showMessageDialog(null, "Nu s-a putut executa "
			 	+ " comanda MySQL UPDATE FROM ... WHERE\n" + exc.getMessage(),
				"Atenție ! Eroare !", JOptionPane.ERROR_MESSAGE);
				return;
			}
		}
	}
}