package com.fp.frontend.controller.armas.solicitud;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;

import org.primefaces.context.RequestContext;

import com.fp.dto.Request;
import com.fp.dto.Response;
import com.fp.dto.query.DtoQuery;
import com.fp.frontend.controller.AbstractController;
import com.fp.frontend.helper.MessageHelper;
import com.fp.frontend.utility.MsgGeneral;
import com.fp.persistence.parmas.soli.TarmCabRepDestruirArmas;
import com.fp.persistence.parmas.soli.TarmDetRepDestruirArmas;

/**
 * Clase controladora de la revision de reporte de armas a destruirse por parte
 * del supervisor militar
 *
 * @author Christian Pazmino
 *
 */
@SuppressWarnings("serial")
@ManagedBean
@ViewScoped
public class RevisarReporteArmasADestruirController extends AbstractController<TarmCabRepDestruirArmas> {

    private Integer creporte;
    private Date fechaCorte;
    /**
     * Variable que indica si el funcionario esta negado para iniciar el flujo y
     * enviar el reporte a su superior para aprobacion
     */
    private Boolean isDenied;

    private TarmCabRepDestruirArmas cabRepDestruirArmasObj;

    @ManagedProperty(value = "#{cabRepDestruirArmasController}")
    private CabRepDestruirArmasController cabRepDestruirArmasController;

    @ManagedProperty(value = "#{detRepDestruirArmasController}")
    private DetRepDestruirArmasController detRepDestruirArmasController;

    public RevisarReporteArmasADestruirController() throws Exception {
        super(TarmCabRepDestruirArmas.class);
        // TODO Auto-generated constructor stub
    }

    @PostConstruct
    private void postconstruct() {
        super.startQuery();
        if (this.getMfilters().get("creporte") != null) {
            creporte = Integer.parseInt(this.getMfilters().get("creporte"));
        }
        if (creporte != null) {
            this.getMfilters().clear();
            this.init();
        } else {
            detRepDestruirArmasController.setLrecord(new ArrayList<TarmDetRepDestruirArmas>());
        }
//        this.querydatabase();
    }

    /**
     * Incializa el controlador, cuando se esta utilizando una pagina que utliza
     * el controlador.
     */
    private void init() {
        try {
            isDenied = Boolean.FALSE;
            cabRepDestruirArmasObj = CabRepDestruirArmasController.findByCodigo(creporte.toString());
            detRepDestruirArmasController.addFilter("creporte", creporte.toString());
            detRepDestruirArmasController.query();
//        	detRepDestruirArmasLst = DetRepDestruirArmasController.findByCReporte(creporte.toString());
            recperpage = 10; // Cambiar al # reg a mirar.
            lrecord = new ArrayList<TarmCabRepDestruirArmas>();
            beanalias = "TARMREVISAREPDECARMAS";

        } catch (Exception e) {
            MessageHelper.setMessageError(e);
        }
    }

    @Override
    public void next() {
        try {
            if (creporte != null) {
                this.detRepDestruirArmasController.next();
            }
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    @Override
    public void previous() {
        try {
            if (creporte != null) {
                this.detRepDestruirArmasController.previous();
            }
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    @SuppressWarnings("unchecked")
    @Override
    protected void querydatabase() {
        try {
            DtoQuery dto = super.getDtoQuery(true);
            dto.setOrderby("t.pk");
            super.addFilter("pk", creporte.toString());

            HashMap<String, DtoQuery> mtables = new HashMap<String, DtoQuery>();
            mtables.put(beanalias, dto); // permite adicionar mas de una tabla.

            Request request = callerhelper.getRequest();
            request.setQueryTables(mtables);

            Response resp = callerhelper.executeQuery(request);

            if (resp.getResponseCode().compareTo(Response.RESPONSE_OK) != 0) {
                lrecord = new ArrayList<TarmCabRepDestruirArmas>();
                MessageHelper.setMessageError(resp);
            } else {
                lrecord = (List<TarmCabRepDestruirArmas>) resp.get(beanalias);
                if (lrecord.size() > 0) {
                    record = lrecord.get(0);
                }
                super.postQuery(lrecord);
            }

        } catch (Throwable e) {
            MessageHelper.setMessageError(e);
        }
    }

    public Integer getCreporte() {
        return creporte;
    }

    public void setCreporte(Integer creporte) {
        this.creporte = creporte;
    }

    public Date getFechaCorte() {
        return fechaCorte;
    }

    public void setFechaCorte(Date fechaCorte) {
        this.fechaCorte = fechaCorte;
    }

    public CabRepDestruirArmasController getCabRepDestruirArmasController() {
        return cabRepDestruirArmasController;
    }

    public void setCabRepDestruirArmasController(
            CabRepDestruirArmasController cabRepDestruirArmasController) {
        this.cabRepDestruirArmasController = cabRepDestruirArmasController;
    }

    public DetRepDestruirArmasController getDetRepDestruirArmasController() {
        return detRepDestruirArmasController;
    }

    public void setDetRepDestruirArmasController(
            DetRepDestruirArmasController detRepDestruirArmasController) {
        this.detRepDestruirArmasController = detRepDestruirArmasController;
    }

    public Boolean getIsDenied() {
        return isDenied;
    }

    public void setIsDenied(Boolean isDenied) {
        this.isDenied = isDenied;
    }

    public TarmCabRepDestruirArmas getCabRepDestruirArmasObj() {
        return cabRepDestruirArmasObj;
    }

    public void setCabRepDestruirArmasObj(
            TarmCabRepDestruirArmas cabRepDestruirArmasObj) {
        this.cabRepDestruirArmasObj = cabRepDestruirArmasObj;
    }

    @Override
    public void save() {
        try {

            Request request = callerhelper.getRequest();
            super.cleanRequest(request);
            request.modifiedData().put("BPMStatus", "A");
//			request.modifiedData().put("creporte", creporte);
            request.modifiedData().put("TID", tid);
            request.modifiedData().put("BPMObs", "Revision del supervisor militar");
            request.modifiedData().put("comment", "");
            request.modifiedData().put("observacion", "");
            Map<String, Object> datosmail = new HashMap<String, Object>();
            request.modifiedData().put("datosmail", datosmail);
            Response resp = callerhelper.executeSave(request);
            if (resp.getResponseCode().compareTo(Response.RESPONSE_OK) == 0) {
                this.setShowRow(true);
                MessageHelper.setMessageInfo(resp, MsgGeneral.getProperty("msg_initFlow") + "CREPORTE: 1");
                isDenied = Boolean.TRUE;
                RequestContext.getCurrentInstance().execute("Maia.refreshusertasks()");
            } else {
                MessageHelper.setMessageError(resp);
            }

        } catch (Throwable e) {
            MessageHelper.setMessageError(e);
        }
    }

}
