package com.ejie.ab39a.model;

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

import org.springframework.context.i18n.LocaleContextHolder;

import com.ejie.ab39a.constantes.Constantes;
import com.ejie.ab39a.utils.Utilidades;
import com.ejie.x38.serialization.JsonDateDeserializer;
import com.ejie.x38.serialization.JsonDateSerializer;
import com.ejie.x38.util.Constants;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.gfi.utils.Utilities;

/**
 * PlanesEstrategicos.
 * 
 *  
 */

public class PlanesEstrategicos implements java.io.Serializable {

    private static final long serialVersionUID = 1L;
    private Integer codplane;
    private Entidades entidad;
    private Planificacion planificacion;
    private Long anyoinicio;
    private Long anyofin;
    private Long indiceObligat;
    private Long nivelCumplimientoReqeus;
    private Date fechaAceptacionPlan;
    private String nombre;
    private String nombreeus;
    private Integer solitudTxostena;
    private Long porcentajeBiling;
    private Integer activo;
    private Date fechaAlta;
    private Date fechaModificacion;
    private Integer codVersion;
    private Integer codTecnico;
    private Integer tieneVersion;
    private Integer numPgAlta;

    // Atributo para controlar el tipo de entidad del usuario
    private String tipoEntidad;

    private List<Entidades> entidades = new ArrayList<Entidades>();

    // Atributo necesario para controlar la query a realizar en el filtro
    private String usuarioConectado;

    /**
     * Method 'PlanesEstrategicos'.
     */
    public PlanesEstrategicos() {
        super();
    }

    /**
     * Method 'PlanesEstrategicos'.
     * 
     * @param codplane
     *            Integer codigo plan
     */
    public PlanesEstrategicos(Integer codplane) {
        super();
        this.codplane = codplane;
    }

    /**
     * Method 'PlanesEstrategicos'.
     * 
     * @param codplane
     *            Integer codplane
     * @param entidad
     *            Entidades entidad
     * @param planificacion
     *            Planificacion planificacion
     * @param anyoinicio
     *            Long anyoinicio
     * @param anyofin
     *            Long anyofin
     * @param indiceObligat
     *            Long indiceObligat
     * @param nivelCumplimientoReqeus
     *            Long nivelCumplimientoReqeus
     * @param fechaAceptacionPlan
     *            Date fechaAceptacionPlan
     * @param nombre
     *            String nombre
     * @param nombreeus
     *            String nombreeus
     * @param solitudTxostena
     *            Integer solitudTxostena
     * @param codVersion
     *            Integer codVersion
     * @param porcentajeBilin
     *            Long porcentajeBilin
     * @param activo
     *            Integer activo
     * @param fechaAlta
     *            Date fechaAlta
     * @param tipoEntidad
     *            String tipoEntidad
     */
    public PlanesEstrategicos(Integer codplane, Entidades entidad, Planificacion planificacion, Long anyoinicio,
            Long anyofin, Long indiceObligat, Long nivelCumplimientoReqeus, Date fechaAceptacionPlan, String nombre,
            String nombreeus, Integer solitudTxostena, Integer codVersion, Long porcentajeBilin, Integer activo,
            Date fechaAlta, String tipoEntidad) {
        super();

        this.codplane = codplane;
        this.entidad = entidad;
        this.planificacion = planificacion;
        this.anyoinicio = anyoinicio;
        this.anyofin = anyofin;
        this.indiceObligat = indiceObligat;
        this.nivelCumplimientoReqeus = nivelCumplimientoReqeus;
        this.fechaAceptacionPlan = fechaAceptacionPlan;
        this.nombre = nombre;
        this.nombreeus = nombreeus;
        this.solitudTxostena = solitudTxostena;
        this.porcentajeBiling = porcentajeBilin;
        this.activo = activo;
        this.fechaAlta = fechaAlta;
        this.codVersion = codVersion;
        this.tipoEntidad = tipoEntidad;
    }

    /**
     * Method 'PlanesEstrategicos'.
     * 
     * @param codplane
     *            Integer codplane
     * @param entidad
     *            Entidades entidad
     * @param planificacion
     *            Planificacion planificacion
     * @param anyoinicio
     *            Long anyoinicio
     * @param anyofin
     *            Long anyofin
     * @param indiceObligat
     *            Long indiceObligat
     * @param nivelCumplimientoReqeus
     *            Long nivelCumplimientoReqeus
     * @param fechaAceptacionPlan
     *            Date fechaAceptacionPlan
     * @param nombre
     *            String nombre
     * @param nombreeus
     *            String nombreeus
     * @param solitudTxostena
     *            Integer solitudTxostena
     * @param porcentajeBiling
     *            Long porcentajeBiling
     * @param activo
     *            Integer activo
     * @param fechaAlta
     *            Date fechaAlta
     * @param codVersion
     *            Integer codVersion
     * @param tipoEntidad
     *            String tipoEntidad
     * @param entidades
     *            List<Entidades> entidades
     * @param usuarioConectado
     *            String usuarioConectado
     */
    public PlanesEstrategicos(Integer codplane, Entidades entidad, Planificacion planificacion, Long anyoinicio,
            Long anyofin, Long indiceObligat, Long nivelCumplimientoReqeus, Date fechaAceptacionPlan, String nombre,
            String nombreeus, Integer solitudTxostena, Long porcentajeBiling, Integer activo, Date fechaAlta,
            Integer codVersion, String tipoEntidad, List<Entidades> entidades, String usuarioConectado) {
        super();
        this.codplane = codplane;
        this.entidad = entidad;
        this.planificacion = planificacion;
        this.anyoinicio = anyoinicio;
        this.anyofin = anyofin;
        this.indiceObligat = indiceObligat;
        this.nivelCumplimientoReqeus = nivelCumplimientoReqeus;
        this.fechaAceptacionPlan = fechaAceptacionPlan;
        this.nombre = nombre;
        this.nombreeus = nombreeus;
        this.solitudTxostena = solitudTxostena;
        this.porcentajeBiling = porcentajeBiling;
        this.activo = activo;
        this.fechaAlta = fechaAlta;
        this.codVersion = codVersion;
        this.tipoEntidad = tipoEntidad;
        this.entidades = entidades;
        this.usuarioConectado = usuarioConectado;
    }

    /**
     * Method 'getCodplane'.
     *
     * @return Integer
     */

    public Integer getCodplane() {
        return this.codplane;
    }

    /**
     * Method 'setCodplane'.
     *
     * @param codplane
     *            Integer
     */

    public void setCodplane(Integer codplane) {
        this.codplane = codplane;
    }

    /**
     * Method 'getCodentidad'.
     *
     * @return Integer
     */

    public Entidades getEntidad() {
        return this.entidad;
    }

    /**
     * Method 'setCodentidad'.
     *
     * @param codentidad
     *            Integer
     */

    public void setEntidad(Entidades entidad) {
        this.entidad = entidad;
    }

    /**
     * Method 'getCodplanificacion'.
     *
     * @return Long
     */

    public Planificacion getPlanificacion() {
        return this.planificacion;
    }

    /**
     * Method 'setCodplanificacion'.
     *
     * @param codplanificacion
     *            Long
     */

    public void setPlanificacion(Planificacion planificacion) {
        this.planificacion = planificacion;
    }

    /**
     * Method 'getAnyoinicio'.
     *
     * @return Long
     */

    public Long getAnyoinicio() {
        return this.anyoinicio;
    }

    /**
     * Method 'setAnyoinicio'.
     *
     * @param anyoinicio
     *            Long
     */

    public void setAnyoinicio(Long anyoinicio) {
        this.anyoinicio = anyoinicio;
    }

    /**
     * Method 'getAnyofin'.
     *
     * @return Long
     */

    public Long getAnyofin() {
        return this.anyofin;
    }

    /**
     * Method 'setAnyofin'.
     *
     * @param anyofin
     *            Long
     */

    public void setAnyofin(Long anyofin) {
        this.anyofin = anyofin;
    }

    /**
     * Method 'getIndiceObligat'.
     *
     * @return Long
     */

    public Long getIndiceObligat() {
        return this.indiceObligat;
    }

    /**
     * Method 'setIndiceObligat'.
     *
     * @param indiceObligat
     *            Long
     */

    public void setIndiceObligat(Long indiceObligat) {
        this.indiceObligat = indiceObligat;
    }

    /**
     * Method 'getNivelCumplimientoReqeus'.
     *
     * @return Long
     */

    public Long getNivelCumplimientoReqeus() {
        return this.nivelCumplimientoReqeus;
    }

    /**
     * Method 'setNivelCumplimientoReqeus'.
     *
     * @param nivelCumplimientoReqeus
     *            Long
     */

    public void setNivelCumplimientoReqeus(Long nivelCumplimientoReqeus) {
        this.nivelCumplimientoReqeus = nivelCumplimientoReqeus;
    }

    /**
     * Method 'getFechaAceptacionPlan'.
     *
     * @return java.util.Date
     */

    @JsonSerialize(using = JsonDateSerializer.class)
    public Date getFechaAceptacionPlan() {
        return this.fechaAceptacionPlan;
    }

    /**
     * Method 'setFechaAceptacionPlan'.
     *
     * @param fechaAceptacionPlan
     *            java.util.Date
     */
    @JsonDeserialize(using = JsonDateDeserializer.class)
    public void setFechaAceptacionPlan(Date fechaAceptacionPlan) {
        this.fechaAceptacionPlan = fechaAceptacionPlan;
    }

    /**
     * Method 'getFechaAceptacionPlanStr'.
     * 
     * @return String
     */
    public String getFechaAceptacionPlanStr() {
        return Utilities.formatearDateIdioma(this.fechaAceptacionPlan);
    }

    /**
     * Method 'getNombre'.
     *
     * @return String
     */

    public String getNombre() {
        return this.nombre;
    }

    /**
     * Method 'setNombre'.
     *
     * @param nombre
     *            String
     */

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    /**
     * Method 'getNombreeus'.
     *
     * @return String
     */

    public String getNombreeus() {
        return this.nombreeus;
    }

    /**
     * Method 'setNombreeus'.
     *
     * @param nombreeus
     *            String
     */

    public void setNombreeus(String nombreeus) {
        this.nombreeus = nombreeus;
    }

    /**
     * Method 'getNombreIdioma'.
     * 
     * @return String nombre en el idioma en qle se haya conectado el usuario
     */
    public String getNombreIdiomaAnyo() {
        StringBuilder desc = new StringBuilder(Constantes.VACIO);
        /*
         * if (Constants.EUSKARA.equals(LocaleContextHolder.getLocale().getLanguage ())) {
         * desc.append(this.getNombreeus()); } else { desc.append(this.getNombre()); }
         */
        if (Constants.EUSKARA.equals(LocaleContextHolder.getLocale().getLanguage())) {
            if (Utilidades.isEmpty(this.getNombreeus())) {
                if (Utilidades.isEmpty(this.getNombre())) {
                    desc.append("");
                } else {
                    desc.append(this.getNombre());
                }
            } else {
                desc.append(this.getNombreeus());
            }
        } else {
            if (Utilidades.isEmpty(this.getNombre())) {
                if (Utilidades.isEmpty(this.getNombreeus())) {
                    desc.append("");
                } else {
                    desc.append(this.getNombreeus());
                }
            } else {
                desc.append(this.getNombre());

            }
        }
        if (this.getAnyoinicio() != null) {
            desc.append(Constantes.ESPACIO);
            desc.append(this.getAnyoinicio());
        }
        if (this.getAnyofin() != null) {
            desc.append(Constantes.SEPARADOR);
            desc.append(this.getAnyofin());
        }
        return desc.toString();
    }

    /**
     * 
     * @return String
     */
    public String getNombreIdioma() {
        StringBuilder desc = new StringBuilder(Constantes.VACIO);
        if (Constants.EUSKARA.equals(LocaleContextHolder.getLocale().getLanguage())) {
            desc.append(this.getNombreeus());
        } else {
            desc.append(this.getNombre());
        }
        return desc.toString();
    }

    /**
     * Method 'getNombre'.
     *
     * @return String
     */

    public String getNombreEsEu() {
        if (Constants.EUSKARA.equals(LocaleContextHolder.getLocale().getLanguage())) {
            if (Utilidades.isEmpty(this.getNombreeus())) {
                if (Utilidades.isEmpty(this.getNombre())) {
                    return "";
                } else {
                    return this.getNombre();
                }
            } else {
                return this.getNombreeus();
            }
        } else {
            if (Utilidades.isEmpty(this.getNombre())) {
                if (Utilidades.isEmpty(this.getNombreeus())) {
                    return "";
                } else {
                    return this.getNombreeus();
                }
            } else {
                return this.getNombre();

            }
        }
    }

    /**
     * 
     * @return String
     */
    public String getAnyos() {
        StringBuilder desc = new StringBuilder(Constantes.VACIO);
        if (this.getAnyoinicio() != null) {
            desc.append(this.getAnyoinicio());
        }
        if (this.getAnyofin() != null) {
            desc.append(Constantes.GUION);
            desc.append(this.getAnyofin());
        }
        return desc.toString();
    }

    /**
     * Method 'getSolitudTxostena'
     * 
     * @return Integer
     */

    public Integer getSolitudTxostena() {
        return solitudTxostena;
    }

    /**
     * Method 'setSolitudTxostena'
     * 
     * @param solitudTxostena
     */
    public void setSolitudTxostena(Integer solitudTxostena) {
        this.solitudTxostena = solitudTxostena;
    }

    /**
     * Method 'getCodVersion'
     * 
     * @return Integer
     */
    public Integer getCodVersion() {
        return codVersion;
    }

    /**
     * Method 'setCodVersion'
     * 
     * @param solitudTxostena
     */
    public void setCodVersion(Integer codVersion) {
        this.codVersion = codVersion;
    }

    /**
     * Method 'getActivo'
     * 
     * @param Integer
     *            activo
     */
    public Integer getActivo() {
        return activo;
    }

    /**
     * Method 'setActivo'
     * 
     * @param activo
     */
    public void setActivo(Integer activo) {
        this.activo = activo;
    }

    /**
     * Method 'getFechaAlta'
     * 
     * @param Date
     *            fechaAlta
     */
    public Date getFechaAlta() {
        return fechaAlta;
    }

    /**
     * Method 'setFechaAlta'
     * 
     * @param fechaAlta
     */
    public void setFechaAlta(Date fechaAlta) {
        this.fechaAlta = fechaAlta;
    }

    /**
     * @return the fechaModificacion
     */
    public Date getFechaModificacion() {
        return fechaModificacion;
    }

    /**
     * @param fechaModificacion
     *            the fechaModificacion to set
     */
    public void setFechaModificacion(Date fechaModificacion) {
        this.fechaModificacion = fechaModificacion;
    }

    /**
     * Method 'getPorcentajeBiling'
     * 
     * @return Long
     */
    public Long getPorcentajeBiling() {
        return porcentajeBiling;
    }

    /**
     * Method 'setPorcentajeBiling'
     * 
     * @param porcentajeBiling
     *            Long
     */
    public void setPorcentajeBiling(Long porcentajeBiling) {
        this.porcentajeBiling = porcentajeBiling;
    }

    /**
     * @return the entidades
     */
    public List<Entidades> getEntidades() {
        return entidades;
    }

    /**
     * @param entidades
     *            the entidades to set
     */
    public void setEntidades(List<Entidades> entidades) {
        this.entidades = entidades;
    }

    /**
     * Devuelve el nombre de la entidad justo con los años de la planificación
     * 
     * @return String descripcion nombre entidad y fechas planificacion
     */
    public String getEntidadPlanificacion() {
        StringBuilder entidadPlani = new StringBuilder(Constantes.VACIO);

        if (this.entidad != null && this.entidad.getDesentidad() != null) {
            entidadPlani.append(this.entidad.getDesentidad());
        }
        if (this.planificacion != null && this.planificacion.getFechainicio() != null
                && !this.planificacion.getFechainicio().equals(Constantes.NUM_CERO)) {
            entidadPlani.append(Constantes.GUION);
            entidadPlani.append(this.planificacion.getFechainicio());
        }
        if (this.planificacion != null && this.planificacion.getFechafin() != null
                && !this.planificacion.getFechafin().equals(Constantes.NUM_CERO)) {
            entidadPlani.append(Constantes.SEPARADOR);
            entidadPlani.append(this.planificacion.getFechafin());
        }

        return entidadPlani.toString();
    }

    /**
     * 
     * @return String
     */
    public String getUsuarioConectado() {
        return usuarioConectado;
    }

    /**
     * 
     * @param usuarioConectado
     *            String usuarioConectado
     */
    public void setUsuarioConectado(String usuarioConectado) {
        this.usuarioConectado = usuarioConectado;
    }

    /**
     * 
     * /** Intended only for logging and debugging.
     * 
     * Here, the contents of every main field are placed into the result.
     * 
     * @return String
     */
    @Override
    public String toString() {
        StringBuilder result = new StringBuilder();
        result.append(this.getClass().getName()).append(" Object { ");
        result.append(" [ codplane: ").append(this.codplane).append(" ]");
        result.append(", [ codentidad: ").append(this.entidad).append(" ]");
        result.append(", [ codplanificacion: ").append(this.planificacion).append(" ]");
        result.append(", [ anyoinicio: ").append(this.anyoinicio).append(" ]");
        result.append(", [ anyofin: ").append(this.anyofin).append(" ]");
        result.append(", [ indiceObligat: ").append(this.indiceObligat).append(" ]");
        result.append(", [ nivelCumplimientoReqeus: ").append(this.nivelCumplimientoReqeus).append(" ]");
        result.append(", [ fechaAceptacionPlan: ").append(this.fechaAceptacionPlan).append(" ]");
        result.append(", [ nombre: ").append(this.nombre).append(" ]");
        result.append(", [ nombreeus: ").append(this.nombreeus).append(" ]");
        result.append(", [ porcentajeBiling: ").append(this.porcentajeBiling).append(" ]");
        result.append("}");
        return result.toString();
    }

    /**
     * @return Integer
     */
    public Integer getTieneVersion() {
        return tieneVersion;
    }

    /**
     * @param tieneVersion
     *            Integer
     */
    public void setTieneVersion(Integer tieneVersion) {
        this.tieneVersion = tieneVersion;
    }

    public Integer getCodTecnico() {
        return codTecnico;
    }

    public void setCodTecnico(Integer codTecnico) {
        this.codTecnico = codTecnico;
    }

    public Integer getNumPgAlta() {
        return numPgAlta;
    }

    public void setNumPgAlta(Integer numPgAlta) {
        this.numPgAlta = numPgAlta;
    }

    /**
     * @return the tipoEntidad
     */
    public String getTipoEntidad() {
        return tipoEntidad;
    }

    /**
     * @param tipoEntidad
     *            the tipoEntidad to set
     */
    public void setTipoEntidad(String tipoEntidad) {
        this.tipoEntidad = tipoEntidad;
    }

}