/*
 * Created on 22.12.2003
 *
 * To change the template for this generated file go to
 * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
 */
package cz.triangle.dostal.prace.action;

import java.text.DateFormat;
import java.util.Calendar;
import java.util.Date;
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.Query;
import net.sf.hibernate.Session;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

import struts.HibernatePlugIn;
import cz.triangle.dostal.prace.Hodinovka;
import cz.triangle.dostal.prace.Prace;
import cz.triangle.dostal.prace.Prehled;
import cz.triangle.dostal.prace.PrehledDovolena;
import cz.triangle.dostal.prace.form.DatumForm;
import cz.triangle.dostal.prace.form.HodinovkaForm;
import cz.triangle.dostal.prace.form.VyberUzivatelForm;
import cz.triangle.dostal.trzby.Uzivatel;

/**
 * @author xrusr01
 *
 * To change the template for this generated type comment go to
 * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
 */
public class PrehledAction extends Action {
	public static String SUCCESS = "vypis";
	public static String CHYBA = "chyba";
	
	public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
		Session session = HibernatePlugIn.sessionFactory(request).openSession();
		try {
			//test logovani
			HttpSession httpSession = request.getSession();
			
			String archiv = (String) httpSession.getAttribute("archiv");
			//jestlize je admin nacteni uzivatelu
			if (request.isUserInRole("admin")){
				List uzivatele = null; 
				if ((archiv!=null) && (archiv.equalsIgnoreCase("ano"))){
					uzivatele = session.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{
					uzivatele = session.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("uzivatele", uzivatele);
				request.setAttribute("admin", new Boolean(true));			
			}
			else{
				request.setAttribute("admin", new Boolean(false));			
			}
			//zjisteni uzivatel
			String uzivJmeno = request.getRemoteUser();
			List uzivateleList = session.find("from Uzivatel as uzivatel where uzivatel.uzivJmeno=?", uzivJmeno, Hibernate.STRING);
			Uzivatel uzivatel = (Uzivatel) uzivateleList.get(0);
			//jestlize jsem administrator - uzivatel je vybrany
			if (request.isUserInRole("admin")){
				Uzivatel vybranyUzivatel = (Uzivatel) httpSession.getAttribute("uzivatel");
				if (vybranyUzivatel!=null){
					uzivatel = vybranyUzivatel;
					// nactu uzivatele pro pripadne nove udaje
					uzivatel = (Uzivatel) session.load(Uzivatel.class, uzivatel.getId());
				}
				VyberUzivatelForm uzivForm = new VyberUzivatelForm();
				uzivForm.setId_uzivatel(uzivatel.getId());
				uzivForm.setNavrat("prehled");
				request.setAttribute("vyberUzivatelForm", uzivForm);
			}
			httpSession.setAttribute("uzivatel", uzivatel);

			//zjisteni datumu
			DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.MEDIUM, new Locale("cs", "CZ"));
			Date datum = null;
			String s_datum;
			datum = (Date) httpSession.getAttribute("datum");
/*
			if (datum == null) {
				s_datum = request.getParameter("datum");
				if ((s_datum != null) && (!s_datum.trim().equalsIgnoreCase(""))) {
					datum = dateFormat.parse(s_datum);
				}
			}
*/
			if (datum == null) {
				datum = new Date();
			}
			Calendar datumC = Calendar.getInstance();
			datumC.setTime(datum);
			String den = String.valueOf(datumC.get(Calendar.DAY_OF_MONTH));
			String mesic = String.valueOf(datumC.get(Calendar.MONTH) + 1);
			String rok = String.valueOf(datumC.get(Calendar.YEAR));
			httpSession.setAttribute("datum", datum);
			DatumForm f2 = new DatumForm();
			f2.setDatum(dateFormat.format(datum));
			f2.setNavrat("prehled");
			request.setAttribute("datumForm", f2);

			// zjisteni ci zapsani hodinovky
			int imesic = datumC.get(Calendar.MONTH)+1;
			int irok = datumC.get(Calendar.YEAR);
			request.setAttribute("popisek",imesic+"/"+irok);
			
			Hodinovka hodinovka = null;
			List seznam = session.find("from Hodinovka as hodinovka where hodinovka.rok="+String.valueOf(rok)+" and mesic="+String.valueOf(mesic)+" and id_uzivatel="+uzivatel.getId());
			if (seznam.size()>0){
				hodinovka = (Hodinovka) seznam.get(0);
			}else{
				hodinovka = new Hodinovka();
				hodinovka.setId_uzivatel(uzivatel.getId());
				hodinovka.setMesic(imesic);
				hodinovka.setRok(irok);
				hodinovka.setCastka(uzivatel.getHodinovka());
				hodinovka.setCena_stravenka(uzivatel.getCena_stravenka());
				hodinovka.setDoplatek_stravenka(uzivatel.getDoplatek_stravenka());
				session.save(hodinovka);
			}
			HodinovkaForm f3 = new HodinovkaForm();
			f3.setCastka(String.valueOf(hodinovka.getCastka()));
			request.setAttribute("hodinovkaForm", f3);

			// nacteni polozek PostgreSql	
					Query sqlQuery =
						session.createSQLQuery(
							"select {prace.*} from prace {prace} where id_uzivatel="
								+ uzivatel.getId()
								+ " and EXTRACT(month FROM casdo)="
								+ mesic
								+ " and EXTRACT(year FROM casod)="
								+ rok
								+ " order by casod",
							"prace",
							Prace.class);
			// HSQL
/*
			Query sqlQuery =
				session.createSQLQuery(
					"select {prace.*} from prace {prace} where id_uzivatel="
						+ uzivatel.getId()
						+ " and MONTH(casdo)="
						+ mesic
						+ " and YEAR(casod)="
						+ rok
						+ " order by casod",
					"prace",
					Prace.class);
*/
																								//dovolena, nemoc, paragraf
			List dovolene = session.find("from Dovolena as dovolena where dovolena.id_uzivatel="+ uzivatel.getId() +" order by casOd");
			PrehledDovolena prehledDovolena = new PrehledDovolena();
			prehledDovolena.napln(dovolene, datum);
			request.setAttribute("prehledDovolena", prehledDovolena);

			List polozky = sqlQuery.list();
			Prehled prehled = new Prehled();
			prehled.napln(polozky, uzivatel, hodinovka.getCastka(),prehledDovolena,datum);
			request.setAttribute("prehled", prehled);
			
		} catch (Exception e) {
			request.setAttribute(CHYBA, "Napodařilo se načíst položky.");
		}

		if (session != null) {
			session.flush();
			session.connection().commit();
 			session.close();
		}
		return mapping.findForward(SUCCESS);
	}

}
