package it.csi.demo.democomp.business.miaapp;

import java.util.*;

import it.csi.demo.democomp.dto.*;
import it.csi.demo.democomp.dto.common.*;
import it.csi.demo.democomp.dto.nspersona.*;

import org.apache.log4j.*;
import it.csi.demo.democomp.util.*;
import it.csi.demo.democomp.business.*;

/*PROTECTED REGION ID(R-1185626779) ENABLED START*/
import it.csi.demo.democomp.business.mgr.GestoreLimitiAmm;
import it.csi.demo.democomp.business.mgr.GestorePersona;
import it.csi.demo.democomp.business.business.dao.refappdao.dto.CittadinoDto;
import it.csi.demo.democomp.business.business.dao.refappdao.dto.CittadinoPk;
import java.math.BigDecimal;
/*PROTECTED REGION END*/

public class CPBECpHome {

	/**  */
	protected static final Logger log = Logger
			.getLogger(Constants.APPLICATION_CODE + ".business");

	//////////////////////////////////////////////////////////////////////////////
	/// Costanti identificative degli Application Data
	//////////////////////////////////////////////////////////////////////////////

	public final static String APPDATA_PERSONE_CODE = "appDatapersone";

	public final static String APPDATA_FILTROPERSONA_CODE = "appDatafiltroPersona";

	public final static String APPDATA_PROVINCE_CODE = "appDataprovince";

	public final static String APPDATA_REGIONI_CODE = "appDataregioni";

	public final static String APPDATA_SELTABELLAIDPERSONA_CODE = "appDataselTabellaIdPersona";

	public final static String APPDATA_SELETTOREOPERAZIONE_CODE = "appDataselettoreOperazione";

	public final static String APPDATA_CITTADINO_CODE = "appDatacittadino";

	public final static String APPDATA_COMUNI_CODE = "appDatacomuni";

	public final static String APPDATA_COMUNI2_CODE = "appDatacomuni2";

	public final static String APPDATA_PROVINCE2_CODE = "appDataprovince2";

	//////////////////////////////////////////////////////////////////////////////
	/// Metodi associati alla U.I.
	//////////////////////////////////////////////////////////////////////////////

	// nome del content panel associato al bean
	public final static String CPNAME = "cpHome";

	/** 
	 * Restituisce il tab correntemente visibile in un determinato tab set
	 */
	private String getCurrentTab(Map session, String tabSetName) {
		String value = (String) session.get(CPNAME + "_" + tabSetName
				+ "_selectedMultiPanel");
		return value;
	}

	////////////////////////////////////////////////////////////////////////////////////

	public ExecResults eseguiRicerca(

	it.csi.demo.democomp.dto.miaapp.CpHomeModel theModel

	) throws BEException {
		/// definizione costanti di outcome
		final String ESEGUIRICERCA_OUTCOME_CODE__OK = "ok";
		final String ESEGUIRICERCA_OUTCOME_CODE__KO = "ko";
		///
		try {
			ExecResults result = new ExecResults();
			/*PROTECTED REGION ID(R-1271636177) ENABLED START*/
			// inserire qui la logica applicativa da eseguire:

			Persona filtro = theModel.getAppDatafiltroPersona();
			if (filtro.getCodRegione() == 0) {
				result.getFldErrors().put("appDatafiltroPersona.codRegione",
						"Attenzione il campo Regione e' obbligatorio");
			}

			if (filtro.getCodProvincia() == 0) {
				result.getFldErrors().put("appDatafiltroPersona.codProvincia",
						"Attenzione il campo Provincia e' obbligatorio");
			}

			if (filtro.getCognome() != null
					&& filtro.getCognome().trim().length() < 2) {
				result.getFldErrors()
						.put("appDatafiltroPersona.cognome",
								"Attenzione il campo Cognome e' obbligatorio e deve contenere almeno 2 caratteri");
			}

			if (!result.getFldErrors().isEmpty()) {
				result.setResultCode(ESEGUIRICERCA_OUTCOME_CODE__KO);
				result.setModel(theModel);
				return result;
			}

			if (theModel.getAppDatafiltroPersona().getCognome() != null
					&& !theModel.getAppDatafiltroPersona().getCognome().trim()
							.equals("")) {
				theModel.getAppDatafiltroPersona().setCognome(
						theModel.getAppDatafiltroPersona().getCognome()
								.toUpperCase());
			}

			theModel.setAppDatapersone(getGestorePersona().getElencoPersone(
					theModel.getAppDatafiltroPersona()));

			if (theModel.getAppDatapersone() == null
					|| theModel.getAppDatapersone().isEmpty()) {
				result.setResultCode(ESEGUIRICERCA_OUTCOME_CODE__KO);
			} else {
				result.setResultCode(ESEGUIRICERCA_OUTCOME_CODE__OK);
			}
			// impostazione del result code

			// modifica degli attributi del model (che verranno propagati allo strato
			// di presentation). si puo' agire anche direttamente sull'attributo "session".

			result.setModel(theModel);
			return result;
			/*PROTECTED REGION END*/
		} catch (Exception e) {
			log.error(
					"[BackEndFacade::eseguiRicerca] Errore occorso nell'esecuzione del metodo:"
							+ e, e);
			throw new BEException("Errore occorso nell'esecuzione del metodo:"
					+ e, e);
		}
	}

	////////////////////////////////////////////////////////////////////////////////////

	public ExecResults azzeraCampiRicerca(

	it.csi.demo.democomp.dto.miaapp.CpHomeModel theModel

	) throws BEException {
		/// definizione costanti di outcome
		final String AZZERACAMPIRICERCA_OUTCOME_CODE__OK = "Ok";
		///
		try {
			ExecResults result = new ExecResults();
			/*PROTECTED REGION ID(R-1764364844) ENABLED START*/
			// inserire qui la logica applicativa da eseguire:

			/*
			Persona z = new Persona();
			z.setCodRegione(0);
			z.setCodProvincia(0);
			z.setCognome("");
			z.setRetribuzione(0);
			
			theModel.setAppDatafiltroPersona(z);
			 */

			theModel.setAppDatafiltroPersona(new Persona());
			theModel.setAppDataregioni(getGestoreLimitiAmm().getAllRegioni());
			theModel.setAppDataprovince(new ArrayList<Provincia>());
			theModel.setAppDatapersone(new ArrayList<Persona>());

			//theModel.setAppDatapersone(getGestorePersona().getElencoPersone(
			//		theModel.getAppDatafiltroPersona()));

			// impostazione del result code
			result.setResultCode(AZZERACAMPIRICERCA_OUTCOME_CODE__OK);
			// modifica degli attributi del model (che verranno propagati allo strato
			// di presentation). si puo' agire anche direttamente sull'attributo "session".

			result.setModel(theModel);
			return result;
			/*PROTECTED REGION END*/
		} catch (Exception e) {
			log.error(
					"[BackEndFacade::azzeraCampiRicerca] Errore occorso nell'esecuzione del metodo:"
							+ e, e);
			throw new BEException("Errore occorso nell'esecuzione del metodo:"
					+ e, e);
		}
	}

	////////////////////////////////////////////////////////////////////////////////////

	public ExecResults cancellaRecordSelezionati(

	it.csi.demo.democomp.dto.miaapp.CpHomeModel theModel

	) throws BEException {
		/// definizione costanti di outcome
		final String CANCELLARECORDSELEZIONATI_OUTCOME_CODE__OK = "Ok";
		final String CANCELLARECORDSELEZIONATI_OUTCOME_CODE__KO = "Ko";
		///
		try {
			ExecResults result = new ExecResults();
			/*PROTECTED REGION ID(R1882280485) ENABLED START*/
			// inserire qui la logica applicativa da eseguire:
			if (theModel.getAppDataselTabellaIdPersona() == null) {
				result.getFldErrors().put("appDataselTabellaIdPersona",
						"Selezionare la persona da cancellare");
				result.setResultCode(CANCELLARECORDSELEZIONATI_OUTCOME_CODE__KO);
			} else {
				result.getFldErrors().put("appDataselTabellaIdPersona",
						"Funzione disabilitata nella DEMO");
				result.setResultCode(CANCELLARECORDSELEZIONATI_OUTCOME_CODE__OK);
			}

			//			getGestorePersona().cancellaCittadino(
			//					theModel.getAppDataselTabellaIdPersona());
			//			// impostazione del result code
			//			result.setResultCode(CANCELLARECORDSELEZIONATI_OUTCOME_CODE__OK);
			//			// modifica degli attributi del model (che verranno propagati allo strato
			//			// di presentation). si puo' agire anche direttamente sull'attributo "session".
			//
			//			theModel.setAppDatapersone(getGestorePersona().getElencoPersone(
			//					theModel.getAppDatafiltroPersona()));

			result.setModel(theModel);
			return result;
			/*PROTECTED REGION END*/
		} catch (Exception e) {
			log.error(
					"[BackEndFacade::cancellaRecordSelezionati] Errore occorso nell'esecuzione del metodo:"
							+ e, e);
			throw new BEException("Errore occorso nell'esecuzione del metodo:"
					+ e, e);
		}
	}

	////////////////////////////////////////////////////////////////////////////////////

	public ExecResults visualizzaRecordVuoto(

	it.csi.demo.democomp.dto.miaapp.CpHomeModel theModel

	) throws BEException {
		/// definizione costanti di outcome
		final String VISUALIZZARECORDVUOTO_OUTCOME_CODE__OK = "ok";
		///
		try {
			ExecResults result = new ExecResults();
			/*PROTECTED REGION ID(R352047776) ENABLED START*/
			// inserire qui la logica applicativa da eseguire:
			Cittadino z = new Cittadino();
			theModel.setAppDatacittadino(z);

			theModel.setAppDataselettoreOperazione("INS");

			// impostazione del result code
			result.setResultCode(VISUALIZZARECORDVUOTO_OUTCOME_CODE__OK);
			// modifica degli attributi del model (che verranno propagati allo strato
			// di presentation). si puo' agire anche direttamente sull'attributo "session".

			result.setModel(theModel);
			return result;
			/*PROTECTED REGION END*/
		} catch (Exception e) {
			log.error(
					"[BackEndFacade::visualizzaRecordVuoto] Errore occorso nell'esecuzione del metodo:"
							+ e, e);
			throw new BEException("Errore occorso nell'esecuzione del metodo:"
					+ e, e);
		}
	}

	////////////////////////////////////////////////////////////////////////////////////

	public ExecResults modificaRecordSelezionato(

	it.csi.demo.democomp.dto.miaapp.CpHomeModel theModel

	) throws BEException {
		/// definizione costanti di outcome
		final String MODIFICARECORDSELEZIONATO_OUTCOME_CODE__OK = "Ok";
		final String MODIFICARECORDSELEZIONATO_OUTCOME_CODE__KO = "Ko";
		///
		try {
			ExecResults result = new ExecResults();
			/*PROTECTED REGION ID(R1283594808) ENABLED START*/
			// inserire qui la logica applicativa da eseguire:

			if (theModel.getAppDataselTabellaIdPersona() == null) {
				result.getFldErrors().put("appDataselTabellaIdPersona",
						"Selezionare la persona da modificare");
				result.setModel(theModel);
				result.setResultCode(MODIFICARECORDSELEZIONATO_OUTCOME_CODE__KO);
				return result;
			}

			theModel.setAppDataselettoreOperazione("UPD");
			// impostazione del result code
			result.setResultCode(MODIFICARECORDSELEZIONATO_OUTCOME_CODE__OK);
			// modifica degli attributi del model (che verranno propagati allo strato
			// di presentation). si puo' agire anche direttamente sull'attributo "session".

			Cittadino z = new Cittadino();

			z = getGestorePersona().getCittadinoByPk(
					theModel.getAppDataselTabellaIdPersona());

			//impostazione delle combo con i valori precedenti

			theModel.setAppDataprovince(getGestoreLimitiAmm().getAllProvince());

			theModel.setAppDataprovince2(getGestoreLimitiAmm().getAllProvince());

			z.setIdProvinciaNascita(getGestoreLimitiAmm().getProvinciaByComune(
					z.getIdComuneNascita()));

			z.setIdProvinciaResid(getGestoreLimitiAmm().getProvinciaByComune(
					z.getIdComuneResid()));

			theModel.setAppDatacomuni(getGestoreLimitiAmm()
					.getComuniByProvincia(z.getIdProvinciaNascita()));

			theModel.setAppDatacomuni2(getGestoreLimitiAmm()
					.getComuniByProvincia(z.getIdProvinciaResid()));

			// fine impostazioni combo

			theModel.setAppDatacittadino(z);

			result.setModel(theModel);
			return result;
			/*PROTECTED REGION END*/
		} catch (Exception e) {
			log.error(
					"[BackEndFacade::modificaRecordSelezionato] Errore occorso nell'esecuzione del metodo:"
							+ e, e);
			throw new BEException("Errore occorso nell'esecuzione del metodo:"
					+ e, e);
		}
	}

	////////////////////////////////////////////////////////////////////////////////////

	public ExecResults gestisciCombo(

	it.csi.demo.democomp.dto.miaapp.CpHomeModel theModel

	) throws BEException {
		/// definizione costanti di outcome
		final String GESTISCICOMBO_OUTCOME_CODE__OK = "ok";
		///
		try {
			ExecResults result = new ExecResults();
			/*PROTECTED REGION ID(R348602115) ENABLED START*/
			// inserire qui la logica applicativa da eseguire:
			if (theModel.getAppDatafiltroPersona() == null) {
				theModel.setAppDatafiltroPersona(new Persona());
			}

			if (theModel.getAppDataregioni() == null) {
				theModel.setAppDataregioni(getGestoreLimitiAmm()
						.getAllRegioni());
				theModel.setAppDataprovince(new ArrayList<Provincia>());
			} else {
				if (theModel.getAppDatafiltroPersona().getCodRegione() == 0) {
					theModel.setAppDataprovince(new ArrayList<Provincia>());
				} else {
					theModel.setAppDataprovince(getGestoreLimitiAmm()
							.getProvinceByRegione(
									theModel.getAppDatafiltroPersona()
											.getCodRegione()));
				}
			}
			// impostazione del result code
			result.setResultCode(GESTISCICOMBO_OUTCOME_CODE__OK);
			// modifica degli attributi del model (che verranno propagati allo strato
			// di presentation). si puo' agire anche direttamente sull'attributo "session".

			result.setModel(theModel);
			return result;
			/*PROTECTED REGION END*/
		} catch (Exception e) {
			log.error(
					"[BackEndFacade::gestisciCombo] Errore occorso nell'esecuzione del metodo:"
							+ e, e);
			throw new BEException("Errore occorso nell'esecuzione del metodo:"
					+ e, e);
		}
	}

	//////////////////////////////////////////////////////////////////////////////
	/// Metodi statici per il reset delle tabelle
	//////////////////////////////////////////////////////////////////////////////

	public static void resetClearStatus_widg_tRicerca(java.util.Map session) {
		session.put("cpHome_tRicerca_clearStatus", Boolean.TRUE);
	}

	//////////////////////////////////////////////////////////////////////////////
	/// Property aggiuntive del bean
	//////////////////////////////////////////////////////////////////////////////
	/*PROTECTED REGION ID(R-1358798737) ENABLED START*/
	//// inserire qui le property che si vogliono iniettare in questo bean (es. dao, proxy di pd, ...) 
	GestoreLimitiAmm gestoreLimitiAmm = null;

	public GestoreLimitiAmm getGestoreLimitiAmm() {
		return gestoreLimitiAmm;
	}

	public void setGestoreLimitiAmm(GestoreLimitiAmm gestoreLimitiAmm) {
		this.gestoreLimitiAmm = gestoreLimitiAmm;
	}

	GestorePersona gestorePersona = null;

	public GestorePersona getGestorePersona() {
		return gestorePersona;
	}

	public void setGestorePersona(GestorePersona gestorePersona) {
		this.gestorePersona = gestorePersona;
	}

	/*PROTECTED REGION END*/
}
