/*
 * 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.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.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.PrehledDovolena;
import cz.triangle.dostal.prace.PrehledRok;
import cz.triangle.dostal.prace.form.DatumForm;
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 PrehledRokAction 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 {
			HttpSession httpSession = request.getSession();

			//jestlize je admin nacteni uzivatelu
			if (request.isUserInRole("admin")) {
				List uzivatele =
					session.find(
						"from Uzivatel as uzivatel where (uzivatel.skryty<>true or uzivatel.skryty is null) order by uzivatel.prijmeni, uzivatel.jmeno");
				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);

			//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);

			// projdu postupne vsechny mesice a vypocitam souhrny
			// nejdrive zjistim posledni mesic
			int zacatek = Calendar.JANUARY;
			int konec = Calendar.DECEMBER;
			Calendar ted = Calendar.getInstance();
			if (ted.get(Calendar.YEAR) == datumC.get(Calendar.YEAR)) {
				konec = ted.get(Calendar.MONTH) - 1;
			}
			zacatek++;
			konec++;
			int irok = datumC.get(Calendar.YEAR);

			int pracDobaBezSobot = 0;
			int odpracovanaDoba = 0;
			int odpracovanaDobaBez = 0;
			int lekar = 0;
			int dovolena = 0;
			int nemoc = 0;
			int paragraf = 0;
			int soboty = 0;
			int svatky = 0;
			int kOdpracovani = 0;
			int prescas = 0;
			float odmena = 0.0f;

			for (int imesic = zacatek; imesic <= konec; imesic++) {

				// zjisteni ci zapsani hodinovky

				request.setAttribute("popisek", new Integer(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());
					session.save(hodinovka);
				}
				// nacteni polozek PostgreSql
				Query sqlQuery =
					session.createSQLQuery(
						"select {prace.*} from prace {prace} where id_uzivatel="
							+ uzivatel.getId()
							+ " and EXTRACT(month FROM casdo)="
							+ imesic
							+ " and EXTRACT(year FROM casod)="
							+ irok
							+ " order by casod",
						"prace",
						Prace.class);
				// HSQL
				/*
								Query sqlQuery =
									session.createSQLQuery(
										"select {prace.*} from prace {prace} where id_uzivatel="
											+ uzivatel.getId()
											+ " and MONTH(casdo)="
											+ imesic
											+ " and YEAR(casod)="
											+ irok
											+ " order by casod",
										"prace",
										Prace.class);
				*/
				List polozky = sqlQuery.list();
				PrehledRok prehled = new PrehledRok();
				prehled.napln(
					polozky,
					uzivatel,
					hodinovka.getCastka(),
					prehledDovolena,
					datum);

				pracDobaBezSobot += prehled.getPracovniDobaVMesici();
				odpracovanaDoba += prehled.getPrace();
				odpracovanaDobaBez += prehled.getPraceBezPrestavky();
				lekar += prehled.getLekar();
				soboty += prehled.getSoboty();
				svatky += prehled.getPocetPlacenychSvatku();
				kOdpracovani += prehled.getUvazekProMesic();
				prescas += prehled.getPrescas();
				odmena += prehled.getOdmenaPrescas();
			}
			dovolena += prehledDovolena.getDovolenaRok();
			nemoc += prehledDovolena.getNemocRok();
			paragraf += prehledDovolena.getParagrafRok();

			// zapis do requestu
			request.setAttribute(
				"formatedPracDobaBezSobot",
				getFormatedHodiny(pracDobaBezSobot, uzivatel));
			request.setAttribute(
				"formatedOdpracovanaDoba",
				getFormatedHodiny(odpracovanaDoba, uzivatel));
			request.setAttribute(
				"formatedOdpracovanaDobaBez",
				getFormatedHodiny(odpracovanaDobaBez, uzivatel));
			request.setAttribute(
				"formatedLekar",
				getFormatedHodiny(lekar, uzivatel));
			request.setAttribute("dovolena", new Integer(dovolena));
			request.setAttribute("nemoc", new Integer(nemoc));
			request.setAttribute("paragraf", new Integer(paragraf));
			request.setAttribute("soboty", new Integer(soboty));
			request.setAttribute("svatky", new Integer(svatky));
			request.setAttribute(
				"formatedKOdpracovani",
				getFormatedHodiny(kOdpracovani, uzivatel));
			request.setAttribute(
				"prescas",
				getFormatedHodiny(prescas, uzivatel));
			request.setAttribute("odmena", new Float(odmena));

		} 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);
	}

	public String getFormatedHodiny(int hodnota, Uzivatel uzivatel) {
		NumberFormat form = NumberFormat.getInstance();
		form.setMinimumIntegerDigits(2);
		int dny = hodnota / 60 / uzivatel.getUvazek();
		int hodiny = (hodnota - dny * uzivatel.getUvazek() * 60) / 60;
		int minuty = (hodnota - dny * uzivatel.getUvazek() * 60 - hodiny * 60);
		return form.format(dny)
			+ ":"
			+ form.format(hodiny)
			+ ":"
			+ form.format(minuty);
	}

}
