//$Id: UzivatelAction.java,v 1.6 2007/11/30 15:30:21 xvymv01 Exp $
package cz.triangle.dostal.prace.action;

import java.text.DateFormat;
import java.text.NumberFormat;
import java.text.ParseException;
import java.util.Calendar;
import java.util.Date;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import net.sf.hibernate.Hibernate;
import net.sf.hibernate.HibernateException;
import net.sf.hibernate.Session;
import net.sf.hibernate.Transaction;

import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.actions.DispatchAction;

import struts.HibernatePlugIn;
import cz.triangle.dostal.prace.Role;
import cz.triangle.dostal.prace.form.UzivatelForm;
import cz.triangle.dostal.trzby.Provozovna;
import cz.triangle.dostal.trzby.Uzivatel;
import cz.triangle.util.MD5;

public class UzivatelAction extends DispatchAction {

	public static String SUCCESS = "vypis";
	public static String CHYBA = "chyba";
	public static String AKCE = "akce";
	public static String AKCE_PO_ODESLANI = "akce_po_odeslani";

	public ActionForward execute(
		ActionMapping mapping,
		ActionForm form,
		HttpServletRequest request,
		HttpServletResponse response)
		throws Exception {

		ActionForward forward = null;

		forward = super.execute(mapping, form, request, response);

		vypis(mapping, form, request, response);

		return forward;

	}

	public ActionForward novy(
		ActionMapping mapping,
		ActionForm form,
		HttpServletRequest request,
		HttpServletResponse response)
		throws Exception {
		DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.MEDIUM, new Locale("cs", "CZ"));

		UzivatelForm f = new UzivatelForm();
		f.setNastup(dateFormat.format(new Date()));
		Calendar cal = Calendar.getInstance();
		cal.set(Calendar.YEAR, cal.get(Calendar.YEAR) + 20);
		f.setKonec(dateFormat.format(cal.getTime()));
		f.setDovolena("0");
		f.setHodinovka("0");
		f.setDoplatek_stravenka("0,0");
		f.setCena_stravenka("0,0");
		request.setAttribute("uzivatelForm", f);
		
		request.setAttribute(AKCE_PO_ODESLANI, "zapsatnovy");

		return mapping.findForward(SUCCESS);
	}

	public ActionForward smazat(
		ActionMapping mapping,
		ActionForm form,
		HttpServletRequest request,
		HttpServletResponse response)
		throws Exception {

		Session hsess = HibernatePlugIn.sessionFactory(request).openSession();
		Transaction tx = null;
		try {
			tx = hsess.beginTransaction();
			String id_string = request.getParameter("id");
			Uzivatel polozka =
				(Uzivatel) hsess.load(Uzivatel.class, new Long(id_string));
			hsess.delete(polozka);
			tx.commit();
			request.setAttribute(AKCE_PO_ODESLANI, "zapsat");
			request.setAttribute("id", null);
		} catch (HibernateException e) {
			request.setAttribute(CHYBA, "Napodařilo se zapsat změny.");
			if (tx != null)
				tx.rollback();
		} catch (Exception e) {
			request.setAttribute(CHYBA, "Napodařilo se smazat.");
		} finally {
			hsess.close();
		}
		return mapping.findForward(SUCCESS);
	}

	public ActionForward zapsatnovy(
		ActionMapping mapping,
		ActionForm form,
		HttpServletRequest request,
		HttpServletResponse response)
		throws Exception {

		Session hsess = HibernatePlugIn.sessionFactory(request).openSession();
		Transaction tx = null;
		try {
			tx = hsess.beginTransaction();
			UzivatelForm f = (UzivatelForm) form;
			Uzivatel polozka = new Uzivatel();
			polozka.setJmeno(f.getJmeno());
			polozka.setPrijmeni(f.getPrijmeni());
			polozka.setUzivJmeno(f.getUzivJmeno());
			DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.MEDIUM, new Locale("cs", "CZ"));
			polozka.setNastup(dateFormat.parse(f.getNastup()));
			polozka.setKonec(dateFormat.parse(f.getKonec()));
			if ((f.getHeslo() != null)
				&& (!f.getHeslo().trim().equalsIgnoreCase(""))) {
				polozka.setHeslo(MD5.encode(f.getHeslo()));
			}

			Long[] provozovny = f.getProvozovny();
			HashSet prov = new HashSet();
			if (provozovny != null) {
				for (int i = 0; i < provozovny.length; i++) {
					Provozovna tmp = new Provozovna();
					tmp.setId(provozovny[i]);
					prov.add(tmp);
				}
			}
			polozka.setProvozovny(prov);

			try {
				polozka.setDovolena(Integer.parseInt(f.getDovolena()));
			} catch (NumberFormatException e) {
				polozka.setHodinovka(0.0f);
			}
			/*
			 * polozka.setZustatekDovolena(
			 * Integer.parseInt(f.getZustatekDovolena()));
			 */
			NumberFormat nf = NumberFormat.getNumberInstance(new Locale("cs"));
			try {
				polozka.setHodinovka(nf.parse(f.getHodinovka()).floatValue());
			} catch (ParseException e) {
				polozka.setHodinovka(0.0f);
			}
			try {
				polozka.setCena_stravenka(nf.parse(f.getCena_stravenka())
						.floatValue());
			} catch (ParseException e) {
				polozka.setHodinovka(0.0f);
			}
			try {
				polozka.setDoplatek_stravenka(nf.parse(
						f.getDoplatek_stravenka()).floatValue());
			} catch (ParseException e) {
				polozka.setHodinovka(0.0f);
			}
			polozka.setUvazek(Integer.parseInt(f.getUvazek()));
			if ((f.getSoboty() != null)
				&& (f.getSoboty().equalsIgnoreCase("ano")))
				polozka.setSoboty(true);
			else
				polozka.setSoboty(false);
			
			hsess.save(polozka);

			if ((f.getTrzby() != null) && (f.getTrzby().equalsIgnoreCase("ano"))){
				hsess.save(new Role(polozka.getUzivJmeno(), "admin_dostal"));
			}
			
			if ((f.getSpravaTrzeb() != null) && (f.getSpravaTrzeb().equalsIgnoreCase("ano"))){
				hsess.save(new Role(polozka.getUzivJmeno(), "sprava_dostal"));
			}

			//zapiseme roli pracovnik
			Role r = new Role(polozka.getUzivJmeno(), "pracovnik");
			hsess.save(r);

			request.setAttribute(AKCE_PO_ODESLANI, "zapsat");
			request.setAttribute("id", polozka.getId());
			tx.commit();
		} catch (HibernateException e) {
			request.setAttribute(CHYBA, "Napodařilo se zapsat změny.");
			if (tx != null)
				tx.rollback();
		} catch (Exception e) {
			request.setAttribute(CHYBA, "Napodařilo se zapsat změny.");
		} finally {
			hsess.close();
		}

		return mapping.findForward(SUCCESS);
	}

	public ActionForward zapsat(
		ActionMapping mapping,
		ActionForm form,
		HttpServletRequest request,
		HttpServletResponse response)
		throws Exception {

		Session hsess = HibernatePlugIn.sessionFactory(request).openSession();
		Transaction tx = null;
		try {
			tx = hsess.beginTransaction();
			UzivatelForm f = (UzivatelForm) form;
			String id_string = request.getParameter("id");
			Uzivatel polozka =
				(Uzivatel) hsess.load(Uzivatel.class, new Long(id_string));

			polozka.getProvozovny().removeAll(polozka.getProvozovny());
			Long[] provozovny = f.getProvozovny();
			if (provozovny != null) {
				for (int i = 0; i < provozovny.length; i++) {
					Provozovna tmp = new Provozovna();
					tmp.setId(provozovny[i]);
					polozka.getProvozovny().add(tmp);
				}
			}
			polozka.setJmeno(f.getJmeno());
			polozka.setPrijmeni(f.getPrijmeni());
			polozka.setUzivJmeno(f.getUzivJmeno());
			DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.MEDIUM, new Locale("cs", "CZ"));
			polozka.setNastup(dateFormat.parse(f.getNastup()));
			polozka.setKonec(dateFormat.parse(f.getKonec()));
			if ((f.getHeslo() != null)
				&& (!f.getHeslo().trim().equalsIgnoreCase(""))) {
				polozka.setHeslo(MD5.encode(f.getHeslo()));
			}
			try {
				polozka.setDovolena(Integer.parseInt(f.getDovolena()));
			} catch (NumberFormatException e) {
				polozka.setHodinovka(0.0f);
			}
			/*
			polozka.setZustatekDovolena(
				Integer.parseInt(f.getZustatekDovolena()));
				*/
			
			NumberFormat nf = NumberFormat.getNumberInstance(new Locale("cs")); 
			try {
				polozka.setHodinovka(nf.parse(f.getHodinovka()).floatValue());
			} catch (ParseException e) {
				polozka.setHodinovka(0.0f);
			}
			try {
				polozka.setCena_stravenka(nf.parse(f.getCena_stravenka())
						.floatValue());
			} catch (ParseException e) {
				polozka.setHodinovka(0.0f);
			}
			try {
				polozka.setDoplatek_stravenka(nf.parse(
						f.getDoplatek_stravenka()).floatValue());
			} catch (ParseException e) {
				polozka.setHodinovka(0.0f);
			}
			polozka.setUvazek(Integer.parseInt(f.getUvazek()));
			if ((f.getSoboty() != null)
				&& (f.getSoboty().equalsIgnoreCase("ano")))
				polozka.setSoboty(true);
			else
				polozka.setSoboty(false);

			//zjistim, zda ma uzivatel roli, vkladani trzby
			Iterator iter = hsess.iterate("from Role role where role.klic.s1='"+polozka.getUzivJmeno()+"' and role.klic.s2='admin_dostal'");
			boolean roleTrzbyExistuje = false;
			Role roleTrzby = null;
			if (iter.hasNext()){
				roleTrzbyExistuje = true;
				roleTrzby = (Role) iter.next();
			}
			if ((f.getTrzby() != null) && (f.getTrzby().equalsIgnoreCase("ano"))){
				if (!roleTrzbyExistuje){
					hsess.save(new Role(polozka.getUzivJmeno(), "admin_dostal"));
				}
			}
			else{
				if (roleTrzbyExistuje){
					hsess.delete(roleTrzby);
				}
			}

			//zjistim, zda ma uzivatel roli, sprava trzby
			iter = hsess.iterate("from Role role where role.klic.s1='"+polozka.getUzivJmeno()+"' and role.klic.s2='sprava_dostal'");
			boolean roleSpravaTrzbyExistuje = false;
			Role roleSpravaTrzby = null;
			if (iter.hasNext()){
				roleSpravaTrzbyExistuje = true;
				roleSpravaTrzby = (Role) iter.next();
			}
			if ((f.getSpravaTrzeb() != null) && (f.getSpravaTrzeb().equalsIgnoreCase("ano"))){
				if (!roleSpravaTrzbyExistuje){
					hsess.save(new Role(polozka.getUzivJmeno(), "sprava_dostal"));
				}
			}
			else{
				if (roleSpravaTrzbyExistuje){
					hsess.delete(roleSpravaTrzby);
				}
			}

			// provozovny
			request.setAttribute(AKCE_PO_ODESLANI, "zapsat");
			//			hsess.update(polozka);
			tx.commit();
		} catch (HibernateException e) {
			request.setAttribute(CHYBA, "Napodařilo se zapsat změny.");
			if (tx != null)
				tx.rollback();
		} catch (Exception e) {
			request.setAttribute(CHYBA, "Napodařilo se zapsat změny.");
		} finally {
			hsess.close();
		}
		return mapping.findForward(SUCCESS);
	}

	public ActionForward vypis(
		ActionMapping mapping,
		ActionForm form,
		HttpServletRequest request,
		HttpServletResponse response)
		throws Exception {
		// nacteni akci
		Session hsess = HibernatePlugIn.sessionFactory(request).openSession();
		Transaction tx = null;
		try {
			tx = hsess.beginTransaction();
			HttpSession httpSession = request.getSession();
			String archiv = (String) httpSession.getAttribute("archiv");

			//nacetni provozoven
			List provozovny = hsess.find("from Provozovna");
			request.setAttribute("provozovny", provozovny);
			List polozky = null; 
			if ((archiv!=null) && (archiv.equalsIgnoreCase("ano"))){
				polozky = hsess.find("from Uzivatel as uzivatel where uzivatel.konec<? and (uzivatel.skryty<>true or uzivatel.skryty is null) order by uzivatel.prijmeni, uzivatel.jmeno", new Date(), Hibernate.DATE);
			}
			else{
				polozky = hsess.find("from Uzivatel as uzivatel where uzivatel.konec>=? and (uzivatel.skryty<>true or uzivatel.skryty is null) order by uzivatel.prijmeni, uzivatel.jmeno", new Date(), Hibernate.DATE);
			}
			request.setAttribute("polozky", polozky);
			String akce = request.getParameter(AKCE);
			if (!((akce != null) && (akce.equalsIgnoreCase("novy")))) {
				if (polozky.isEmpty()) {
					request.setAttribute(AKCE_PO_ODESLANI, "zapsatnovy");
					return mapping.findForward(SUCCESS);
				} else {
					request.setAttribute(AKCE_PO_ODESLANI, "zapsat");
				}
			}

			// zjisteni aktualni vybraneho prvku
			// id predano ze stranky		
			String id_string = request.getParameter("id");
			Long id_long = null;

			// id nebylo predano - mozna byla vlozena nova polozka
			if (((id_string != null) && (id_string.length() == 0))
				|| (id_string == null)) {
				id_long = (Long) request.getAttribute("id");
			} else {
				// id bylo predano ze stranky - rozparsuju ho
				try {
					id_long = new Long(id_string);
				} catch (NumberFormatException e) {
					request.setAttribute(
						CHYBA,
						"Nepodařilo se načíst aktuální položku.");
				}
			}

			// jestlize byla smazana polozka nulluju id
			if ((akce != null) && (akce.equalsIgnoreCase("smazat"))) {
				id_long = null;
			}

			Uzivatel aktualniPolozka = null;
			if (id_long != null) {
				try {
					aktualniPolozka =
						(Uzivatel) hsess.load(Uzivatel.class, id_long);
					request.setAttribute("aktualniPolozka", aktualniPolozka);
				} catch (HibernateException e) {
					id_long = null;
					//request.setAttribute(CHYBA,"Nepodařilo se načíst aktuální položku.");
				}
			}
			// neni zadana zadna polozka - vezmu prvni ze seznamu
			if (id_long == null) {
				if ((!polozky.isEmpty())
					&& (!((akce != null) && (akce.equalsIgnoreCase("novy"))))) {
					request.setAttribute("aktualniPolozka", polozky.get(0));
					aktualniPolozka = (Uzivatel) polozky.get(0);
				}
			}
			// predani udaju aktualni polozky do formulare
			if (aktualniPolozka != null) {
				UzivatelForm f = new UzivatelForm();
				f.setJmeno(aktualniPolozka.getJmeno());
				f.setPrijmeni(aktualniPolozka.getPrijmeni());
				f.setUzivJmeno(aktualniPolozka.getUzivJmeno());
				f.setId(aktualniPolozka.getId());
				f.setHeslo("");
				f.setDovolena(String.valueOf(aktualniPolozka.getDovolena()));
				/*
				f.setZustatekDovolena(
					String.valueOf(aktualniPolozka.getZustatekDovolena()));
					*/
				NumberFormat nf = NumberFormat.getNumberInstance(new Locale("cs")); 
				f.setHodinovka(nf.format(aktualniPolozka.getHodinovka()));
				f.setCena_stravenka(nf.format(aktualniPolozka.getCena_stravenka()));
				f.setDoplatek_stravenka(nf.format(aktualniPolozka.getDoplatek_stravenka()));
				f.setUvazek(String.valueOf(aktualniPolozka.getUvazek()));
				if ((aktualniPolozka.isSoboty()))
					f.setSoboty("ano");
				else
					f.setSoboty(null);
				Long[] pole = new Long[aktualniPolozka.getProvozovny().size()];
				int i = 0;
				for (Iterator iter = aktualniPolozka.getProvozovny().iterator();
					iter.hasNext();
					) {
					Provozovna element = (Provozovna) iter.next();
					pole[i] = element.getId();
					i++;
				}
				f.setProvozovny(pole);
				//zjistim, zda ma uzivatel roli, vkladani trzby
				Iterator iter = hsess.iterate("from Role role where role.klic.s1='"+aktualniPolozka.getUzivJmeno()+"' and role.klic.s2='admin_dostal'");
				if (iter.hasNext()){
					f.setTrzby("ano");
				}
				//zjistim, zda ma uzivatel roli, sprava trzby
				iter = hsess.iterate("from Role role where role.klic.s1='"+aktualniPolozka.getUzivJmeno()+"' and role.klic.s2='sprava_dostal'");
				if (iter.hasNext()){
					f.setSpravaTrzeb("ano");
				}
				DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.MEDIUM, new Locale("cs", "CZ"));
				f.setNastup(dateFormat.format(aktualniPolozka.getNastup()));
				f.setKonec(dateFormat.format(aktualniPolozka.getKonec()));
				request.setAttribute("uzivatelForm", f);
			}
			tx.commit();
		} catch (HibernateException e) {
			request.setAttribute(CHYBA, "Napodařilo se načíst položky.");
			if (tx != null)
				tx.rollback();
		} catch (Exception e) {
			request.setAttribute(CHYBA, "Napodařilo se načíst položky.");
		} finally {
			hsess.close();
		}
		return mapping.findForward(SUCCESS);
	}

	public ActionForward unspecified(
		ActionMapping mapping,
		ActionForm form,
		HttpServletRequest request,
		HttpServletResponse response)
		throws Exception {

		return mapping.findForward(SUCCESS);
	}

}
