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.AbstractDataTransport;
import com.fp.dto.Request;
import com.fp.dto.Response;
import com.fp.dto.save.DtoSave;
import com.fp.frontend.controller.AbstractController;
import com.fp.frontend.controller.pgeneral.gene.CatalogDetailController;
import com.fp.frontend.controller.pgeneral.gene.ParametersController;
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.TarmDecomisoArma;
import com.fp.persistence.parmas.soli.TarmDetRepDestruirArmas;
import com.fp.persistence.pgeneral.gene.TgeneCatalogDetail;
import com.fp.persistence.pgeneral.gene.TgeneParameters;

/**
 * Clase controladora de la revision de reporte de armas a destruirse por parte
 * del jefe del comando conjunto
 *
 * @author JALVARADO
 *
 */
@SuppressWarnings("serial")
@ManagedBean
@ViewScoped
public class RevisarRprteArmasADestJefCCController extends AbstractController<AbstractDataTransport> {

    private Integer creporte;
    private Date fechaCorte;
    private String estado;

    /**
     * lista del catalogo de las acciones (Aceptar o rechazar)
     *
     */
    private List<TgeneCatalogDetail> laccion;

    /**
     * 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 String observacion;

    private TarmCabRepDestruirArmas tarmCabRepDestruirArmas;

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

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

    @ManagedProperty(value = "#{decomisoArmaController}")
    private DecomisoArmaController decomisoArmaController;

    public RevisarRprteArmasADestJefCCController() throws Exception {
        super(AbstractDataTransport.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();
            this.querydatabase();
        } else {
            detRepDestruirArmasController.setLrecord(new ArrayList<TarmDetRepDestruirArmas>());
        }

    }

    /**
     * Incializa el controlador, cuando se esta utilizando una pagina que utliza
     * el controlador.
     */
    private void init() {
        try {
            isDenied = Boolean.FALSE;
            tarmCabRepDestruirArmas = CabRepDestruirArmasController.findByCodigo(creporte.toString());
            detRepDestruirArmasController.addFilter("creporte", creporte.toString());
            detRepDestruirArmasController.query();
            TgeneParameters tgeneparam = ParametersController.find("CODIGO.AR", "1");
            laccion = CatalogDetailController.find("ESTADOSOLICITUD", tgeneparam.getTextvalue());
        } 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();
        }
    }

    @Override
    protected void querydatabase() {

    }

    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 TarmCabRepDestruirArmas getTarmCabRepDestruirArmas() {
        return tarmCabRepDestruirArmas;
    }

    public void setTarmCabRepDestruirArmas(
            TarmCabRepDestruirArmas tarmCabRepDestruirArmas) {
        this.tarmCabRepDestruirArmas = tarmCabRepDestruirArmas;
    }

    public DecomisoArmaController getDecomisoArmaController() {
        return decomisoArmaController;
    }

    public void setDecomisoArmaController(
            DecomisoArmaController decomisoArmaController) {
        this.decomisoArmaController = decomisoArmaController;
    }

    public List<TgeneCatalogDetail> getLaccion() {
        return laccion;
    }

    public void setLaccion(List<TgeneCatalogDetail> laccion) {
        this.laccion = laccion;
    }

    public Boolean getIsDenied() {
        return isDenied;
    }

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

    public String getEstado() {
        return estado;
    }

    public void setEstado(String estado) {
        this.estado = estado;
    }

    public String getObservacion() {
        return observacion;
    }

    public void setObservacion(String observacion) {
        this.observacion = observacion;
    }

    public String codigoAceptado() throws Exception {
        TgeneParameters f = ParametersController.find("ACEPTADO", "1");
        return f.getTextvalue();
    }

    @Override
    public void save() {
        try {
            Request request = this.callerhelper.getRequest();
            HashMap<String, DtoSave> msave = new HashMap<String, DtoSave>();
            if (observacion != null) {
                request.modifiedData().put("observacion", observacion);
                tarmCabRepDestruirArmas.setObsjefecc(observacion);
                tarmCabRepDestruirArmas.setIsnew(Boolean.FALSE);
                cabRepDestruirArmasController.update(tarmCabRepDestruirArmas);
                DtoSave dtoSaveCAC = cabRepDestruirArmasController.getDtoSave();
                if (dtoSaveCAC.pendingProcess()) {
                    dtoSaveCAC.setPosition(1);
                    msave.put(cabRepDestruirArmasController.getBeanalias(), dtoSaveCAC);
                }
            }
            // Si el reporte es rechazado se vuelven las armas del reporte a la lista de armas para ser seleccionadas en nuevos reportes
            if (!codigoAceptado().equals(estado)) {
                for (TarmDetRepDestruirArmas armasDecomRprteObj : detRepDestruirArmasController.getLrecord()) {
                    TarmDecomisoArma armasDecomisadasObj = DecomisoArmaController.findByCodigo(armasDecomRprteObj.getCdecomisoarma());
                    armasDecomisadasObj.setAdestruirse(null);
                    armasDecomisadasObj.setAdestruirsecode(null);
                    armasDecomisadasObj.setIsnew(Boolean.FALSE);
                    decomisoArmaController.update(armasDecomisadasObj);
                }
                DtoSave dtoSaveDAC = decomisoArmaController.getDtoSave();
                if (dtoSaveDAC.pendingProcess()) {
                    dtoSaveDAC.setPosition(2);
                    msave.put(decomisoArmaController.getBeanalias(), dtoSaveDAC);
                }
            }
            request.setSaveTables(msave);
            Response resp = this.callerhelper.executeSave(request);
            if (resp.getResponseCode().compareTo(Response.RESPONSE_OK) == 0) {
                this.postCommit(resp);
                this.cabRepDestruirArmasController.postCommit(resp);
                this.decomisoArmaController.postCommit(resp);
                this.setShowRow(true);
                MessageHelper.setMessageInfo(resp);
            } else {
                MessageHelper.setMessageError(resp);
            }
            completarTarea();
        } catch (Throwable e) {
            MessageHelper.setMessageError(e);
        }
    }

    /**
     * Metodo para finalizar la tarea del flujo
     */
    public void completarTarea() {
        try {
            Request request = callerhelper.getRequest();

            super.cleanRequest(request);
            // validamos si cargamos los datos cuando apruebe
            Map<String, Object> datosmail = new HashMap<String, Object>();
            request.modifiedData().put("TID", tid);
            request.modifiedData().put("creporte", creporte);
            request.modifiedData().put("BPMObs", observacion);
            if (codigoAceptado().equals(estado)) {
                request.modifiedData().put("BPMStatus", "A");
            } else {
                request.modifiedData().put("BPMStatus", "D");
            }
            Response resp = callerhelper.executeSave(request);
            if (resp.getResponseCode().compareTo(Response.RESPONSE_OK) == 0) {
                MessageHelper.setMessageInfo(resp, MsgGeneral.getProperty("msg_initFlow") + "jefe dpto - CREPORTE: " + creporte);
                isDenied = Boolean.TRUE;
                RequestContext.getCurrentInstance().execute("Maia.refreshusertasks()");
            } else {
                MessageHelper.setMessageError(resp);
            }

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

}
