/*
 * 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.text.ParseException;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;

import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.FormAttachment;
import org.eclipse.swt.layout.FormData;
import org.eclipse.swt.layout.FormLayout;
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 org.eclipse.swt.widgets.Text;
import org.hibernate.criterion.Restrictions;

import static hibergui.HiberGUI.*;
import hibergui.Form;
import hibergui.Util;
import hibergui.assoc.O2MEdit_Button;
import hibergui.event.ChangeEvent;
import hibergui.event.ChangeListener;
import hibergui.event.ModificationEvent;
import hibergui.event.ModificationListener;
import hibergui.hibernate.HibernateForm;
import hibergui.property.DateEdit;
import hibergui.property.IntegerEdit;
import hibergui.property.StringEdit;
import hibergui.property.TimeEdit1;
import hibergui.verify.Constraint;
import hibergui.verify.VerificationError;

import zemplen.model.Nevezes;
import zemplen.model.Reszido;
import zemplen.model.Szemely;
import zemplen.model.Verseny;

/**
 * @author espakm
 *
 * TODO To change the template for this generated type comment go to
 * Window - Preferences - Java - Code Style - Code Templates
 */
public class NevezesForm extends HibernateForm<Nevezes> {
    
    public VersenyCombo eVerseny;
    SzemelyCombo eSzemely;
    DateEdit eNevezesiDatum;
    NevezesiHelyCombo eNevezesiHely;
    DateEdit eFizetesiDatum;
    IntegerEdit eFizetettOsszeg;
    FizetesiModCombo eFizetesiMod;
    NevezesStatuszCombo eStatusz;
    TavCombo eTav;
    StringEdit eRajtszam;
    KategoriaCombo eKategoria;
    TimeEdit1 eCelido;
    O2MEdit_Button<Reszido> eReszidok;
    StringEdit eMegjegyzes;
    
    Text txtSzuletesiDatum, txtTelepules;
    
    public NevezesForm(Composite cptParent, int mode) {
        super(cptParent, mode);
        
        setWindowTitle("Nevezések");
        
        try {
			Date jul23 = hibergui.Util.dateFormat.parse("2007.07.22.");
			eNevezesiDatum.setDefault(jul23);
			eFizetesiDatum.setDefault(jul23);
		} catch (ParseException e1) {
			e1.printStackTrace();
		}
        eFizetettOsszeg.setDefault(4000);
//        eFizetesiMod.setDefault("készpénz");
//        eNevezesiHely.setDefault("Mád");
        eStatusz.setDefault("Fizetett");
        
//    	eKategoria.setEnabled(false);
        eVerseny.addChangeListener(new ChangeListener() {
			public void change(ChangeEvent e) {
				Verseny verseny = eVerseny.get();
				if (verseny != null) {
					eTav.fixVerseny(verseny);
					eKategoria.fixVerseny(verseny);
				}
			}
        });
        eRajtszam.addConstraint(
				new Constraint(){
					public boolean check(Object o) {
						if (NevezesForm.this.get() != null)
							return true;
						return createCriteria().
						add(Restrictions.eq("rajtszam", o)).
						list().isEmpty();
					}
				},
				new VerificationError("Már van ilyen rajtszámú versenyző!")
		);
        eSzemely.addModificationListener(new ModificationListener(){
			public void modification(ModificationEvent<?> e) {
				Szemely sz = eSzemely.get();
				if (sz == null) {
					txtSzuletesiDatum.setText("");
					txtTelepules.setText("");
				}
				else {
					txtSzuletesiDatum.setText(Util.ensureString(sz.getSzuletesiDatum()));
					txtTelepules.setText(Util.ensure(sz.getLakcimTelepules()));
				}
			}
        });
        txtSzuletesiDatum.setEditable(false);
        txtTelepules.setEditable(false);
    }
    
    @Override
    protected void save(Nevezes nevezes) {
        super.save(nevezes);
        Verseny v = eVerseny.get();
        Set<Nevezes> nevezesek = v.getNevezesek();
        if (nevezesek == null)
        	v.setNevezesek(nevezesek = new HashSet<Nevezes>());
        nevezesek.add(nevezes);
    }
    
    @Override
    protected void delete(Nevezes nevezes) {
        super.delete(nevezes);
        eVerseny.get().getNevezesek().remove(nevezes);
    }
    
    @Override
    protected Composite createFields(Composite cptParent) {
        Composite cpt = new Composite(cptParent, SWT.BORDER);
        
		FormLayout formLayout = new FormLayout();
        FormData formData;

		cpt.setLayout(formLayout);
                
        Group grpSzemely = new Group(cpt, SWT.NONE);
        grpSzemely.setText("Személyi adatok");
        {
        	GridLayout gridLayout = new GridLayout();
        	GridData data;
        	gridLayout.numColumns = 2;
        	grpSzemely.setLayout(gridLayout);

			new Label(grpSzemely, SWT.NONE).setText("Név:");

			eSzemely = new SzemelyCombo(this, grpSzemely, NOT_NULL);
			data = new GridData(GridData.FILL_HORIZONTAL);
			eSzemely.setLayoutData(data);

			new Label(grpSzemely, SWT.NONE).setText("Születési dátum:");

			txtSzuletesiDatum = new Text(grpSzemely, SWT.BORDER);
			data = new GridData(GridData.FILL_HORIZONTAL);
			txtSzuletesiDatum.setLayoutData(data);
			
			new Label(grpSzemely, SWT.NONE).setText("Település:");

			txtTelepules = new Text(grpSzemely, SWT.BORDER);
			data = new GridData(GridData.FILL_HORIZONTAL);
			txtTelepules.setLayoutData(data);
        }

        Group grpNevezes = new Group(cpt, SWT.NONE);
        grpNevezes.setText("Nevezési adatok");
        {
        	GridLayout gridLayout = new GridLayout();
        	GridData data;
        	gridLayout.numColumns = 2;
        	grpNevezes.setLayout(gridLayout);

			new Label(grpNevezes, SWT.NONE).setText("Nevezési dátum:");

			eNevezesiDatum = new DateEdit(this, grpNevezes, NOT_NULL, "nevezesiDatum", "nevezési dátum");
			data = new GridData(GridData.FILL_HORIZONTAL);
			eNevezesiDatum.setLayoutData(data);
        
			new Label(grpNevezes, SWT.NONE).setText("Nevezési hely:");
        
			eNevezesiHely = new NevezesiHelyCombo(this, grpNevezes, NONE);
			data = new GridData(GridData.FILL_HORIZONTAL);
			//      data.widthHint = 200;
			eNevezesiHely.setLayoutData(data);
			
			new Label(grpNevezes, SWT.NONE).setText("Fizetési dátum:");
        
			eFizetesiDatum = new DateEdit(this, grpNevezes, NONE, "fizetesiDatum", "fizetési dátum");
			data = new GridData(GridData.FILL_HORIZONTAL);
			eFizetesiDatum.setLayoutData(data);
        
			new Label(grpNevezes, SWT.NONE).setText("Fizetett összeg:");
        
			eFizetettOsszeg = new IntegerEdit(this, grpNevezes, NONE, "fizetettOsszeg", "fizetett összeg");
			data = new GridData(GridData.FILL_HORIZONTAL);
//      	data.widthHint = 200;
			eFizetettOsszeg.setLayoutData(data);
        
			new Label(grpNevezes, SWT.NONE).setText("Fizetési mód:");
        
			eFizetesiMod = new FizetesiModCombo(this, grpNevezes, NONE);
			data = new GridData(GridData.FILL_HORIZONTAL);
//      	data.widthHint = 200;
			eFizetesiMod.setLayoutData(data);

			new Label(grpNevezes, SWT.NONE).setText("Státusz:");
	        
			eStatusz = new NevezesStatuszCombo(this, grpNevezes, NONE);
			data = new GridData(GridData.FILL_HORIZONTAL);
//      	data.widthHint = 200;
			eStatusz.setLayoutData(data);
        }
        
        Group grpVerseny = new Group(cpt, SWT.NONE);
        grpVerseny.setText("Versenyadatok");
        {
        	GridLayout gridLayout = new GridLayout();
        	GridData data;
            gridLayout.numColumns = 2;
            grpVerseny.setLayout(gridLayout);

            new Label(grpVerseny, SWT.NONE).setText("Elnevezés:");
            eVerseny = new VersenyCombo(this, grpVerseny, NOT_NULL);
        	data = new GridData(GridData.FILL_HORIZONTAL);
//      	data.widthHint = 200;
        	eVerseny.setLayoutData(data);

        	new Label(grpVerseny, SWT.NONE).setText("Táv:");
        
        	eTav = new TavCombo(this, grpVerseny, NOT_NULL);
        	data = new GridData(GridData.FILL_HORIZONTAL);
//      	data.widthHint = 200;
        	eTav.setLayoutData(data);
        
        	new Label(grpVerseny, SWT.NONE).setText("Rajtszám:");
        
        	eRajtszam = new StringEdit(this, grpVerseny, NONE, "rajtszam", "rajtszám");
			data = new GridData(GridData.FILL_HORIZONTAL);
//      	data.widthHint = 200;
        	eRajtszam.setLayoutData(data);
        
        	new Label(grpVerseny, SWT.NONE).setText("Kategória:");
        
        	eKategoria = new KategoriaCombo(this, grpVerseny, NONE);
        	data = new GridData(GridData.FILL_HORIZONTAL);
        	eKategoria.setLayoutData(data);

        	new Label(grpVerseny, SWT.NONE).setText("Célidő:");
            
        	eCelido = new TimeEdit1(this, grpVerseny, NONE, "celido", "célidő");
        	data = new GridData(GridData.FILL_HORIZONTAL);
        	eCelido.setLayoutData(data);

            eReszidok = new O2MEdit_Button<Reszido>(this, grpVerseny, NONE, "reszidok", "Részidők") {
    			@Override
                protected Form<Reszido> createForm(Composite cpt, int style) {
    				ReszidoForm f = new ReszidoForm(cpt, style);
    				f.fixVerseny(eVerseny.get());
    				f.eRajtszam.set(NevezesForm.this.get());
    				f.eRajtszam.fix(true);
    				f.refresh();
    				return f;
                }
            };
            
        }
        
		Composite cptMegjegyzes = new Composite(cpt, SWT.NONE);
		{
        	GridLayout gridLayout = new GridLayout();
        	GridData data;
        	gridLayout.numColumns = 2;
        	cptMegjegyzes.setLayout(gridLayout);

			new Label(cptMegjegyzes, SWT.NONE).setText("Megjegyzés:");
        
			eMegjegyzes = new StringEdit(this, cptMegjegyzes, MULTI, "megjegyzes", "megjegyzés");
			data = new GridData(GridData.FILL_HORIZONTAL);
			data.heightHint = eMegjegyzes.getLineHeight() * 3;
			eMegjegyzes.setLayoutData(data);
		}

        formData = new FormData();
		formData.top = new FormAttachment(0, 0);
		formData.left = new FormAttachment(0, 0);
		formData.right = new FormAttachment(50, -3);
		grpSzemely.setLayoutData(formData);

		formData = new FormData();
//		formData.top = new FormAttachment(0, 0);
		formData.top = new FormAttachment(grpSzemely, 6);
		formData.left = new FormAttachment(0, 0);
		formData.right = new FormAttachment(50, -3);
		formData.bottom = new FormAttachment(100, 0);
		grpNevezes.setLayoutData(formData);

//		formData = new FormData();
//		formData.top = new FormAttachment(0, 0);
//		formData.left = new FormAttachment(50, 3);
//		formData.right = new FormAttachment(100, 0);
//		eVerseny.setLayoutData(formData);

//        formData = new FormData();
//		formData.top = new FormAttachment(eVerseny.getControl(), 6);
//		formData.left = new FormAttachment(50, 3);
//		formData.right = new FormAttachment(100, 0);
//		formData.bottom = new FormAttachment(cptMegjegyzes, -6);
//		grpVerseny.setLayoutData(formData);

		formData = new FormData();
		formData.top = new FormAttachment(0, 0);
		formData.left = new FormAttachment(50, 3);
		formData.right = new FormAttachment(100, 0);
		formData.bottom = new FormAttachment(cptMegjegyzes, -6);
		grpVerseny.setLayoutData(formData);

        formData = new FormData();
		formData.left = new FormAttachment(50, 3);
		formData.right = new FormAttachment(100, 0);
		formData.bottom = new FormAttachment(100, 0);
		cptMegjegyzes.setLayoutData(formData);

		return cpt;
    }

    @Override
    protected void createColumnsForTable() {
        addColumn(SWT.LEFT, "szemely.nev", "Név", 240);
        addColumn(SWT.LEFT, "szemely.szuletesiDatum", "Születési idő", 120);
        addColumn(SWT.LEFT, "fizetettOsszeg", "Fizetett összeg", 60);
        addColumn(SWT.LEFT, "statusz.elnevezes", "Státusz", 100);
        addColumn(SWT.LEFT, "tav.elnevezes", "Táv", 100);
        addColumn(SWT.LEFT, "kategoria.elnevezes", "Kategória", 100);
        addColumn(SWT.LEFT, "rajtszam", "Rajtszám", 60);
        addColumn(SWT.LEFT, "celido", "Célidő", 100);
    }
    
//    @Override
//    protected List<Nevezes> findSuch() {
//    	System.out.println("NevezesForm.findSuch()");
//    	
//    	Criteria crit = createCriteria();
//    	List list1 = crit.list();
//    	System.out.println(list1.size());
//    	
//    	crit.add(createExample(extract()));
//    	List list2 = crit.list();
//    	System.out.println("propertykkel: " + list2.size());
//    	
//    	Szemely sz = eSzemely.extract();
//    	if (sz != null) {
//    		System.out.println(sz.getLakcimTelepules());
//    		crit.createCriteria("root.szemely").add(eSzemely.createExample(sz)).addOrder(Order.asc("nev"));
//    	}
//    	List list3 = crit.list();
//    	System.out.println("szemellyel: " + list3.size());
//    	list2.removeAll(list3);
//    	for (Nevezes n: (List<Nevezes>) list2)
//    		System.out.println(n.getId() + " " + n.getSzemely().getNev());
//    	
//    	Tav t = eTav.extract();
//    	if (t != null)
//    		crit.createCriteria("root.tav").add(eTav.createExample(t));
//    	List list4 = crit.list();
//    	System.out.println("tavval: " + list4.size());
//    	list3.removeAll(list4);
//    	for (Nevezes n: (List<Nevezes>) list3)
//    		System.out.println(n.getId() + " " + n.getSzemely().getNev());
//
//    	NevezesiHely nh = eNevezesiHely.extract();
//    	if (nh != null)
//    		crit.createCriteria("root.nevezesiHely").add(eNevezesiHely.createExample(nh));
//    	List list5 = crit.list();
//    	System.out.println("nevezesi hellyel: " + list5.size());
//    	list4.removeAll(list5);
//    	for (Nevezes n: (List<Nevezes>) list4)
//    		System.out.println(n.getId() + " " + n.getSzemely().getNev());
//    	return list5;
//    	
////    	FizetesiMod fm = eFizetesiMod.extract();
////    	if (fm != null)
////    		crit.createCriteria("root.fizetesiMod").add(eFizetesiMod.createExample(fm));
////    	List list6 = crit.list();
////    	System.out.println("fizetesi moddal: " + list6.size());
////    	list5.removeAll(list6);
////    	for (Nevezes n: (List<Nevezes>) list5)
////    		System.out.println(n.getId() + " " + n.getSzemely().getNev());
////    	// TODO Auto-generated method stub
////    	return super.findSuch();
//    }
}