/*
 * Created on Aug 14, 2004
 *
 * TODO To change the template for this generated file go to
 * Window - Preferences - Java - Code Style - Code Templates
 */
package zemplen.ui;

import java.util.List;

import org.hibernate.HibernateException;
import org.hibernate.Query;

import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;

import static hibergui.HiberGUI.*;
import hibergui.Form;
import hibergui.assoc.O2MEdit_Button;
import hibergui.event.ChangeEvent;
import hibergui.event.ChangeListener;
import hibergui.hibernate.HibernateForm;
import hibergui.property.DateEdit;
import hibergui.property.RadioEdit;
import hibergui.property.StringEdit;

import zemplen.model.Nevezes;
import zemplen.model.Szemely;

/**
 * @author espakm
 *
 * TODO To change the template for this generated type comment go to
 * Window - Preferences - Java - Code Style - Code Templates
 */
public class SzemelyForm extends HibernateForm<Szemely> {
    
    StringEdit eTeljesNev, eBecenev;
    DateEdit eSzuletesiDatum;
    RadioEdit<Character> eNem;
    EgyesuletCombo eEgyesulet;
    StringEdit eTelefonszam;
    StringEdit eEmail;
    StringEdit eLakcimIrszam, eLakcimTelepules, eLakcimUtca, eLakcimOrszag;
    O2MEdit_Button<Nevezes> eNevezesek;
    
    public SzemelyForm(Composite cptParent, int mode) {
        super(cptParent, mode);
        
        setWindowTitle("Személyek");
        
        eLakcimOrszag.setDefault("Magyarország");
        
        ChangeListener lsnNem = new ChangeListener(){
			@SuppressWarnings("unchecked")
			public Character deriveNem() {
				String teljesNev = eTeljesNev.get();
				if (teljesNev == null)
					return null;
		        String[] keresztnevek = teljesNev.substring(teljesNev.indexOf(' ') + 1).split(" ");
		        
		        try {
		            Query query = getSession().createQuery("select distinct n.nem from Nevnap n where n.keresztnev in (:keresztnevek)");
		            query.setParameterList("keresztnevek", keresztnevek);
		            
		            List<Character> result = query.list();
		            if (result.size() == 0)
		                return null;
		            
		            return result.get(0);
		        } catch (HibernateException e) {
		            // TODO Auto-generated catch block
		            e.printStackTrace();
		        }
		        return null;
			}

			public void change(ChangeEvent e) {
				eNem.set(deriveNem());
				verify();
			}
        };
        eTeljesNev.addChangeListener(lsnNem);

//        ChangeListener lsnTelepules = new ChangeListener(){
//			@SuppressWarnings("unchecked")
//			public String deriveTelepules() {
//				String irszam = eLakcimIrszam.get();
//				if (irszam == null)
//					return null;
//		        
//		        try {
//		            Query query = getSession().createQuery("select distinct i.telepules from Iranyitoszam i where i.iranyitoszam = ':irszam'");
//		            query.setParameter("irszam", irszam);
//		            
//		            List<String> result = query.list();
//		            if (result.size() == 0)
//		                return null;
//		            
//		            return result.get(0);
//		        } catch (HibernateException e) {
//		            // TODO Auto-generated catch block
//		            e.printStackTrace();
//		        }
//		        return null;
//			}
//
//			public void change(ChangeEvent e) {
//				eLakcimTelepules.set(deriveTelepules());
//				verify();
//			}
//        };
//        eLakcimIrszam.addChangeListener(lsnTelepules);
    }
    
    @Override
    protected Composite createFields(Composite cptParent) {
        Composite cpt = new Composite(cptParent, SWT.BORDER);
        
        GridLayout gridLayout = new GridLayout();
        gridLayout.numColumns = 2;
        cpt.setLayout(gridLayout);
        
        GridData data;
        
        new Label(cpt, SWT.NONE).setText("Teljes név:");
        eTeljesNev = new StringEdit(this, cpt, NOT_NULL, "nev", "teljes név");
        data = new GridData(GridData.FILL_HORIZONTAL);
        eTeljesNev.setLayoutData(data);
        
        new Label(cpt, SWT.NONE).setText("Becenév:");
        eBecenev = new StringEdit(this, cpt, NONE, "becenev", "becenév");
        data = new GridData(GridData.FILL_HORIZONTAL);
        eBecenev.setLayoutData(data);
        
        new Label(cpt, SWT.NONE).setText("Születési dátum:");
        eSzuletesiDatum = new DateEdit(this, cpt, NONE, "szuletesiDatum", "születési dátum");
        data = new GridData(GridData.FILL_HORIZONTAL);
        eSzuletesiDatum.setLayoutData(data);
        
        new Label(cpt, SWT.NONE).setText("Nem:");
        eNem = new RadioEdit<Character>(this, cpt, NOT_NULL, "nem", "nem") {
            protected String[] createLabels() {
                return new String[]{"Férfi", "Nő"};
            }
        };
        eNem.setInput(new Character[]{Character.valueOf('F'), Character.valueOf('N')});
        
        new Label(cpt, SWT.NONE).setText("Egyesület:");
        eEgyesulet = new EgyesuletCombo(this, cpt, NONE);
        data = new GridData(GridData.FILL_HORIZONTAL);
        eEgyesulet.setLayoutData(data);
        
        new Label(cpt, SWT.NONE).setText("Telefonszám:");
        eTelefonszam = new StringEdit(this, cpt, NONE, "telefonszam", "telefonszám");
        data = new GridData(GridData.FILL_HORIZONTAL);
        eTelefonszam.setLayoutData(data);
        
        new Label(cpt, SWT.NONE).setText("E-mail cím:");
        eEmail = new StringEdit(this, cpt, NONE, "email", "e-mail cím");
        data = new GridData(GridData.FILL_HORIZONTAL);
        eEmail.setLayoutData(data);
        
        Group grpLakcim = new Group(cpt, SWT.NONE);
        grpLakcim.setText("Lakóhely");
        gridLayout = new GridLayout();
        gridLayout.numColumns = 4;
        grpLakcim.setLayout(gridLayout);
        
        	new Label(grpLakcim, SWT.NONE).setText("Irányítószám:");
        	eLakcimIrszam = new StringEdit(this, grpLakcim, NONE, "lakcimIranyitoszam", "irányítószám");
        	data = new GridData(GridData.BEGINNING);
        	data.widthHint = 50;
        	eLakcimIrszam.setLayoutData(data);
        
        	new Label(grpLakcim, SWT.NONE).setText("Település:");
        	eLakcimTelepules = new StringEdit(this, grpLakcim, NOT_NULL, "lakcimTelepules", "település");
        	eLakcimTelepules.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
        
        	new Label(grpLakcim, SWT.NONE).setText("Utca, házszám:");
        	eLakcimUtca = new StringEdit(this, grpLakcim, NONE, "lakcimUtca", "utca, házszám");
        	data = new GridData(GridData.FILL_HORIZONTAL);
        	data.horizontalSpan = 3;
        	eLakcimUtca.setLayoutData(data);
        
        	new Label(grpLakcim, SWT.NONE).setText("Ország:");
        	eLakcimOrszag = new StringEdit(this, grpLakcim, NONE, "lakcimOrszag", "ország");
			data = new GridData(GridData.FILL_HORIZONTAL);
        	data.horizontalSpan = 3;
        	eLakcimOrszag.setLayoutData(data);
        
        data = new GridData(GridData.FILL_HORIZONTAL);
        data.horizontalSpan = 3;
        grpLakcim.setLayoutData(data);
        
        eNevezesek = new O2MEdit_Button<Nevezes>(this, cpt, NONE, "nevezesek", "Nevezések") {
			@Override
			protected Form<Nevezes> createForm(Composite cpt, int formStyle) {
				NevezesForm f = new NevezesForm(cpt, formStyle);
				f.eSzemely.set(SzemelyForm.this.get());
				f.eSzemely.fix(true);
				return f;
			}
        };

        return cpt;
    }
    
    @Override
    protected void createColumnsForTable() {
    	addColumn(SWT.LEFT, "nev", "Név", 200);
    	addColumn(SWT.LEFT, "szuletesiDatum", "Szül. dátum", 120);
    	addColumn(SWT.LEFT, "lakcimTelepules", "Lakhely", 120);
    }
    
//    @SuppressWarnings("unchecked")
//	@Override
//    protected List<Szemely> findSuch() {
//    	return createCriteria().add(createExample(extract())).addOrder(Order.asc("nev")).list();
//    }
}
