package com.fp.frontend.controller.bpm;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;

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

import com.fp.dto.AbstractDataTransport;
import com.fp.dto.Request;
import com.fp.dto.Response;
import com.fp.frontend.controller.AbstractController;
import com.fp.frontend.controller.ReportController;
import com.fp.frontend.controller.pgeneral.date.TgeneAccountingDateBranchController;
import com.fp.frontend.controller.pgeneral.gene.ParametersController;
import com.fp.frontend.controller.security.LoginController;
import com.fp.frontend.helper.MessageHelper;
import com.fp.persistence.pcustomer.gene.TcustPersonDetail;
import com.fp.persistence.pgeneral.gene.TgeneParameters;
import com.fp.persistence.pgeneral.safe.TsafeUserDetail;

/**
 * Clase controladora para exportar flujos.
 *
 * @author WPA
 * @version 2.1
 */
@SuppressWarnings("serial")
@ManagedBean
@ViewScoped
public class ExportFlowsController extends AbstractController<AbstractDataTransport> {

    public ExportFlowsController() throws Exception {
        super(AbstractDataTransport.class);
    }

    @PostConstruct
    private void postconstruct() {
        this.init();
        this.initDates();
        // Inicializa autoconsulta
        super.startQuery();

    }

    /**
     * Atributo fecha desde
     */
    private Date fromdate;

    /**
     * Atributo fecha hasta
     */
    private Date todate;

    @ManagedProperty(value = "#{reportController}")
    private ReportController reportController;
    private String solicitud;
    private Date fec_actual;
    private String codCentroControl;
    private TcustPersonDetail customerperson;
    private TsafeUserDetail userDetail;
    private TsafeUserDetail tsafeUserDetailUsuario = null;
    @ManagedProperty(value = "#{logincontroller}")
    private LoginController logincontroller;

    /**
     * Incializa el controlador, cuando se esta utilizando una pagina que utliza
     * el controlador.
     */
    private void init() {
        try {
            this.recperpage = 10; // Cambiar al # reg a mirar.
            this.lrecord = new ArrayList<>();
            //this.beanalias = "TBPM";
            this.beanalias = "REPORTE";
            this.tsafeUserDetailUsuario = (TsafeUserDetail) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("TSAFEUSERDETAIL");

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

    @Override
    protected void querydatabase() {
        MessageHelper.setMessageError("msg_notQuery");
        return;
    }

    @Override
    public void save() {
        MessageHelper.setMessageError("msg_notSave");
        return;
    }

    /**
     * Ejecuta un QueryAlias
     */
    public void getFileContent() {
        byte[] file = null;
        try {
            Request request = this.callerhelper.getRequest();
            request.put("queryalias", "EXPORTBPM");
            request.put("querytype", "P");
            request.put("creationdate", this.fromdate);
            request.put("enddate", this.todate);

            Response resp = this.callerhelper.executeQuery(request);

            if (resp.getResponseCode().compareTo(Response.RESPONSE_OK) != 0) {
                MessageHelper.setMessageError(resp);
            } else {
                file = (byte[]) resp.get("file");
                super.downloadFile(file, (String) resp.get("contentType"), (String) resp.get("extension"));
            }

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

    /**
     * Inicializa las fechas
     */
    private void initDates() {
        int val = this.getAniosParameter();
        Calendar calendar = Calendar.getInstance();
//		calendar.setTime(this.getWorkingDate());
        this.todate = calendar.getTime();
        calendar.add(Calendar.YEAR, -val);
        calendar.add(Calendar.DATE, -1);
        this.fromdate = calendar.getTime();
    }

    /**
     * Entrega la fecha de trabajo de la aplicacin.
     *
     * @return Fecah Fecha de trabajo.
     * @throws Exception
     */
    private Date getWorkingDate() {
        Date workingDate = null;
        try {
            TgeneAccountingDateBranchController c = new TgeneAccountingDateBranchController();
            c.getMfilters().clear();
            c.getMfilters().put("pk.branchcode", "0");
            c.getMfilters().put("pk.companycode", super.getLoginController().getRequest().getCompany().toString());
            c.query();
            workingDate = c.getRecord().getWorkingdate();
        } catch (Exception ex) {
            //
        }
        return workingDate;
    }

    /**
     * Obtiene el valor del n&uacute;mero de anios m&aacute;ximos para la
     * consulta de flujos
     *
     * @return value
     */
    private Integer getAniosParameter() {
        Integer value = null;
        TgeneParameters parameter = ParametersController.find("MAX_BACK", super.getLoginController().getRequest().getCompany().toString());
        if (parameter != null) {
            value = parameter.getNumbervalue().intValue();
        } else {
            value = 1;
        }
        return value;
    }

    /**
     * Entrega la fecha desde
     *
     * @return formdate Fecha desde
     */
    public Date getFromdate() {
        return fromdate;
    }

    /**
     * Fija la fecha desde
     *
     * @param formdate Fecha desde
     */
    public void setFromdate(Date fromdate) {
        this.fromdate = fromdate;
    }

    /**
     * Entrega la fecha hasta
     *
     * @return formdate Fecha hasta
     */
    public Date getTodate() {
        return todate;
    }

    /**
     * Fija la fecha hasta
     *
     * @param fromdate Fecha hasta
     */
    public void setTodate(Date todate) {
        this.todate = todate;
    }

    public ReportController getReportController() {
        return reportController;
    }

    public void setReportController(ReportController reportController) {
        this.reportController = reportController;
    }

    public String getSolicitud() {
        return solicitud;
    }

    public void setSolicitud(String solicitud) {
        this.solicitud = solicitud;
    }

    public LoginController getLogincontroller() {
        return logincontroller;
    }

    public void setLogincontroller(LoginController logincontroller) {
        this.logincontroller = logincontroller;
    }

    public void reporteFlujoSolicitudXls() {
        try {
            String gradoUsuario = "";
            String path = "general/reports/flujoSolicitud";
            //String filename=MsgControlArmas.getProperty("lbl_tramitesXcentro");
            String filename = "reporte";

            //Fija parametros del report.
            HashMap<String, Object> parameters = new HashMap<>();
            parameters.put("pathLogoIzquierda", "repo:/maia/1/image/comandoconjunto");
            parameters.put("pathLogoDerecha", "repo:/maia/1/image/selloarmas");
            parameters.put("solicitud", solicitud);
            String format = "xls";

            try {
                this.reportController.executeXls(path, parameters, format, filename, this.getLoginController());
            } catch (Exception ex) {
                MessageHelper.setMessageError(ex);
            }

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

}
