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

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

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

import org.primefaces.model.DefaultTreeNode;
import org.primefaces.model.TreeNode;

import com.fp.dto.Request;
import com.fp.dto.Response;
import com.fp.dto.query.DtoQuery;
import com.fp.dto.query.SubQuery;
import com.fp.dto.save.DtoSave;
import com.fp.frontend.controller.AbstractController;
import com.fp.frontend.controller.pgeneral.gene.ProvinceController;
import com.fp.frontend.helper.MessageHelper;
import com.fp.persistence.parmas.param.TarmCentroControl;
import com.fp.persistence.parmas.param.TarmCentroControlJur;
import com.fp.persistence.pgeneral.gene.TgeneCatalogDetail;
import com.fp.persistence.pgeneral.gene.TgeneProvince;

/**
 * Clase controladora del bean TarmCentroControlJur.
 *
 * @author C.P.
 * @version 2.1
 */
@ManagedBean
@ViewScoped
public class TarmCentroControlJurController extends AbstractController<TarmCentroControlJur> {

    private static final long serialVersionUID = 1L;

    /**
     * Nodos para la creacion del arbol
     */
    private TreeNode root;
    /**
     * Variable que se carga cuando selecciona un nodo del arbol
     */
    private TreeNode selectedNode;
    /**
     * Recupera el codigo de la provincia selecionada
     */
    private String codigoProvincia;
    /**
     * Recupera la descripcion de la provincia selecionada
     */
    private String descripcionProvincia;
    /**
     * Carga la lista de las provincias
     */
    private List<TgeneProvince> lprovinces;
    /**
     * Carga el centro de control
     */
    private TarmCentroControl tarmCentroControl;

    /**
     * Inyeccion del controlador centroControlArmasController
     */
    @ManagedProperty(value = "#{centroControlArmasController}")
    private CentroControlArmasController centroControlArmasController;

    public TarmCentroControlJurController() throws Exception {
        super(TarmCentroControlJur.class);
    }

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

    /**
     * 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 = "TARMCENTROCONTROLJURIS";
            tarmCentroControl = new TarmCentroControl();
        } catch (Exception e) {
            MessageHelper.setMessageError(e);
        }
    }

    @SuppressWarnings("unchecked")
    @Override
    public void querydatabase() {
        try {
            Request request = this.callerhelper.getRequest();
            DtoQuery dto = super.getDtoQuery(true);
            SubQuery sprovincia = new SubQuery("TgeneProvince", "description", "desprovincia", "i.pk.countrycode = t.countrycode and i.pk.provincecode= t.provincecode");
            dto.addSubQuery(sprovincia);
            HashMap<String, DtoQuery> mtables = new HashMap<String, DtoQuery>();
            mtables.put(this.beanalias, dto);
            request.setQueryTables(mtables);
            Response resp = this.callerhelper.executeQuery(request);
            if (resp.getResponseCode().compareTo(Response.RESPONSE_OK) != 0) {
                this.lrecord = new ArrayList<TarmCentroControlJur>();
                MessageHelper.setMessageError(resp);
            } else {
                this.lrecord = (List<TarmCentroControlJur>) resp
                        .get(this.beanalias);
                super.postQuery(this.lrecord);
            }
        } catch (Throwable e) {
            MessageHelper.setMessageError(e);
        }
    }

    @Override
    public void save() {
        try {
            Request request = this.callerhelper.getRequest();
            DtoSave dtosave = super.getDtoSave();
            dtosave.setReturnpk(true);
            if (!dtosave.pendingProcess()) {
                return;
            }
            HashMap<String, DtoSave> msave = new HashMap<String, DtoSave>();
            msave.put(this.beanalias, dtosave);

            request.setSaveTables(msave);
            Response resp = this.callerhelper.executeSave(request);
            if (resp.getResponseCode().compareTo(Response.RESPONSE_OK) == 0) {
                this.postCommit(resp);
                MessageHelper.setMessageInfo(resp);
            } else {
                MessageHelper.setMessageError(resp);
            }

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

    @Override
    public void postCommit(Response response) throws Exception {
        super.postCommitGeneric(response, this.beanalias);
    }

    /**
     * Metodo que se ejecuta al pulsar jurisdiccion Inicializa las variables,
     * lista las provincias y el arbol de jurisdiccion
     */
    public void loadEdit() {
        centroControlArmasController.getRecord();// contiene el registro seleccionado
        clearAll();
        listarProvincias();
        root = null;
        getMfilters().put("ccentrocontrol", centroControlArmasController.getRecord().getPk());
        querydatabase();
        root = createTree();//carga el arbol
    }

    /**
     * selecciona un registro para anadir una jurisdiccion
     *
     * @throws Exception
     */
    public void displaySelectedSingle() throws Exception {
        if (selectedNode != null) {
            super.create();
            record.setCountrycode("EC");
            record.setCcentrocontrol(centroControlArmasController.getRecord().getPk());
            listarProvincias();
        }
    }

    /**
     * elimna la jurisdiccion
     *
     * @throws Exception
     */
    public void deleteNode() throws Exception {
        record = (TarmCentroControlJur) selectedNode.getData();
        if (record.getCcentrocontrol() == null || record.getCcentrocontrol().trim().length() == 0) {
            MessageHelper.setMessageError("NO SE PUEDE ELIMINAR EL NODO");
            return;
        }
        record.setProvincianombre(null);
        super.remove();
        selectedNode.getChildren().clear();
        selectedNode.getParent().getChildren().remove(selectedNode);
        selectedNode.setParent(null);
        selectedNode = null;
    }

    /**
     * arma el arbol
     *
     * @return
     */
    @SuppressWarnings("unused")
    public TreeNode createTree() {
        TarmCentroControlJur cabecera = new TarmCentroControlJur();
        cabecera.setProvincianombre(centroControlArmasController.getRecord().getModifiedData().get("desinstitucion").toString());

        TarmCentroControlJur reg1 = new TarmCentroControlJur();
        reg1.setProvincianombre(centroControlArmasController.getRecord().getModifiedData().get("desinstitucion").toString());

        TarmCentroControlJur reg2 = new TarmCentroControlJur();
        reg2.setProvincianombre(centroControlArmasController.getRecord().getModifiedData().get("desnombreinstitucion").toString());

        TreeNode root = new DefaultTreeNode(cabecera, null);
        TreeNode nombreCentro = new DefaultTreeNode(cabecera, root);
        TreeNode Default2 = new DefaultTreeNode(reg2, nombreCentro);
        //se recorre para el arbol
        if (lrecord != null && lrecord.size() > 0) {
            for (TarmCentroControlJur jurisdiccion : lrecord) {
                jurisdiccion.setProvincianombre(nombreProvincia(lprovinces, jurisdiccion.getProvincecode()));
                TreeNode documents = new DefaultTreeNode(jurisdiccion, Default2);
            }
        }
        return root;
    }

    /**
     * Metodo para obtener la descripcion de la provincia
     *
     * @param list
     * @param codigo
     * @return
     */
    public String nombreProvincia(List<TgeneProvince> list, String codigo) {
        for (TgeneProvince item : list) {
            if (item.getPk().getProvincecode().equals(codigo)) {
                return item.getDescription();
            }
        }
        return "";
    }

    /**
     * metodo para a\u00F1adir un nuevo registro de jurisdiccion
     *
     * @param province
     * @throws Exception
     */
    public void setProvincia(TgeneProvince province) throws Exception {
        System.out.println(province.getDescription());
        //validamos que el registro no este ingresado
        List<TarmCentroControlJur> listaJurisdicciones = find();
        if (listaJurisdicciones != null && listaJurisdicciones.size() > 0) {
            for (TarmCentroControlJur item : listaJurisdicciones) {
                if (item.getProvincecode().equals(province.getPk().getProvincecode())) {
                    MessageHelper.setMessageError("LA JURISDICCI\u00D3N YA PERTENECE A UN CENTRO DE CONTROL DE ARMAS");
                    return;
                }
            }
        }
        //validamos sobre la lista que vamos a guardar
        if (this.lrecord != null && this.lrecord.size() > 0) {
            for (TarmCentroControlJur item : this.lrecord) {
                if (item.getProvincecode().equals(province.getPk().getProvincecode())) {
                    MessageHelper.setMessageError("LA JURISDICCI\u00D3N YA PERTENECE A UN CENTRO DE CONTROL DE ARMAS");
                    return;
                }
            }
        }

        record.setProvincecode(province.getPk().getProvincecode());
        addNew(record);
        getLrecord().add(record);
        root = createTree();
        super.update();
    }

    /**
     * Metodo para listar las provincias
     */
    public void listarProvincias() {
        if (lprovinces == null || lprovinces.size() == 0) {
            lprovinces = ProvinceController.findxDescripcion("EC", codigoProvincia, descripcionProvincia);
        }
    }

    public static List<TarmCentroControlJur> find() {
        try {
            TarmCentroControlJurController cc = new TarmCentroControlJurController();
            cc.init();
            cc.recperpage = 300;
            cc.querydatabase();
            if ((cc.lrecord != null) && !cc.lrecord.isEmpty()) {
                return cc.lrecord;
            }
            return null;
        } catch (Throwable e) {
            MessageHelper.setMessageError(e);
            return null;
        }
    }

    public static TarmCentroControlJur findxProvincia(String provincecode) {
        try {
            TarmCentroControlJurController cc = new TarmCentroControlJurController();
            cc.init();
            cc.addFilter("provincecode", provincecode);
            cc.recperpage = 300;
            cc.querydatabase();
            if ((cc.lrecord != null) && !cc.lrecord.isEmpty()) {
                return cc.lrecord.get(0);
            }
            return null;
        } catch (Throwable e) {
            MessageHelper.setMessageError(e);
            return null;
        }
    }
    /**
     *BUSCAR POR CENTRO DE CONTROL
     */
    
    public static TarmCentroControlJur findxCentroControl(String ccentrocontrol) {
        try {
            TarmCentroControlJurController cc = new TarmCentroControlJurController();
            cc.init();
            cc.addFilter("ccentrocontrol", ccentrocontrol);
            cc.recperpage = 300;
            cc.querydatabase();
            if ((cc.lrecord != null) && !cc.lrecord.isEmpty()) {
                return cc.lrecord.get(0);
            }
            return null;
        } catch (Throwable e) {
            MessageHelper.setMessageError(e);
            return null;
        }
    }

    public TreeNode getRoot() {
        return root;
    }

    public void setRoot(TreeNode root) {
        this.root = root;
    }

    public TreeNode getSelectedNode() {
        return selectedNode;
    }

    public void setSelectedNode(TreeNode selectedNode) {
        this.selectedNode = selectedNode;
    }

    public CentroControlArmasController getCentroControlArmasController() {
        return centroControlArmasController;
    }

    public void setCentroControlArmasController(
            CentroControlArmasController centroControlArmasController) {
        this.centroControlArmasController = centroControlArmasController;
    }

    public List<TgeneProvince> getLprovinces() {
        return lprovinces;
    }

    public void setLprovinces(List<TgeneProvince> lprovinces) {
        this.lprovinces = lprovinces;
    }

    public String getCodigoProvincia() {
        return codigoProvincia;
    }

    public void setCodigoProvincia(String codigoProvincia) {
        this.codigoProvincia = codigoProvincia;
    }

    public String getDescripcionProvincia() {
        return descripcionProvincia;
    }

    public void setDescripcionProvincia(String descripcionProvincia) {
        this.descripcionProvincia = descripcionProvincia;
    }

    public TarmCentroControl getTarmCentroControl() {
        return tarmCentroControl;
    }

    public void setTarmCentroControl(TarmCentroControl tarmCentroControl) {
        this.tarmCentroControl = tarmCentroControl;
    }

}
