/*
 * 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.text.NumberFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
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.Query;
import net.sf.hibernate.Session;

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.PrehledStravenky;
import cz.triangle.dostal.prace.form.DatumForm;
import cz.triangle.dostal.prace.form.HodinovkaForm;
import cz.triangle.dostal.prace.form.StravenkyForm;
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 PrehledStravenkyAction 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
			if (request.isUserInRole("admin")){
				request.setAttribute("admin", new Boolean(true));			
			}else{
				return null;
			}
			HttpSession httpSession = request.getSession();
			
			String archiv = (String) httpSession.getAttribute("archiv");

			//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) {
				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);
			
			List uzivatele = null; 
			if ((archiv!=null) && (archiv.equalsIgnoreCase("ano"))){
				uzivatele = session.find("from Uzivatel as uzivatel where uzivatel.konec<? and uzivatel.doplatek_stravenka>0 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.doplatek_stravenka>0 and (uzivatel.skryty<>true or uzivatel.skryty is null) order by uzivatel.prijmeni, uzivatel.jmeno", new Date(), Hibernate.DATE);
			}
			request.setAttribute("uzivatele", uzivatele);
			
			PrehledStravenky prehledStravenky = new PrehledStravenky();
			StravenkyForm stravenkyForm = new StravenkyForm();
			NumberFormat nf = NumberFormat.getNumberInstance(new Locale("cs")); 
			for (Iterator iter = uzivatele.iterator(); iter.hasNext();) {
				Uzivatel uzivatel = (Uzivatel) iter.next();

				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);
				// 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, 50,
						prehledDovolena, datum);
				if (prehled.getStravenek()<1){
					continue;
				}
				stravenkyForm.getDoplatky().put(uzivatel.getId(), nf.format(hodinovka.getDoplatek_stravenka()));
				prehledStravenky.pridejPolozku(
						uzivatel.getJmeno() + "&nbsp;" + uzivatel.getPrijmeni(),
						prehled.getStravenek(), 
						hodinovka.getCena_stravenka(), 
						prehled.getStravenek()*hodinovka.getCena_stravenka(),
						prehled.getStravenek()*hodinovka.getDoplatek_stravenka(),
						prehled.getStravenek()*(hodinovka.getCena_stravenka() - hodinovka.getDoplatek_stravenka()),
						uzivatel.getId()
						);
			}
			Calendar cal = Calendar.getInstance();
			cal.setTime(datum);
			cal.add(Calendar.MONTH,1);
			SimpleDateFormat sdf = new SimpleDateFormat("M/yyyy");
			request.setAttribute("datum_nadpis", sdf.format(cal.getTime()));
			request.setAttribute("prehled", prehledStravenky);
			request.setAttribute("stravenkyForm", stravenkyForm);
			
		} 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);
	}

}
