package com.ejie.ad74a.model;

import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.Date;

/**
 * Representacion de la tabla ayuntamientos
 * @author BICUGUAL
 *
 */
public class Ayuntamiento implements java.io.Serializable {

	private static final long serialVersionUID = 1L;

	private Long idAyuntamiento;
	private String descEs;
	private String descEu;
	private String direccion;
	private String cp;
	private String municipio;
	private String idMunicipio;
	private String provincia;
	private String idProvincia;
	private String cif;
	private String contacto;
	private String telefono;

	private String numCuenta;
	private Integer formaPago;
	private Date fAutorizacion;

	// Periodicidad
	private Integer periodicidad;
	private Integer diaFacturacion;

	// Ultima Facturacion
	private Integer mesHastaUltimaFacturacion;
	private Integer anyoHastaUltimaFacturacion;

	// Proxima facturacion (campos calculados)
	private BigDecimal importe;
	
	public Ayuntamiento() {
		super();
	}

	public Long getIdAyuntamiento() {
		return idAyuntamiento;
	}

	public void setIdAyuntamiento(Long idAyuntamiento) {
		this.idAyuntamiento = idAyuntamiento;
	}

	public String getDescEs() {
		return descEs;
	}

	public void setDescEs(String descEs) {
		this.descEs = descEs;
	}

	public String getDescEu() {
		return descEu;
	}

	public void setDescEu(String descEu) {
		this.descEu = descEu;
	}

	public String getDireccion() {
		return direccion;
	}

	public void setDireccion(String direccion) {
		this.direccion = direccion;
	}

	public String getCp() {
		return cp;
	}

	public void setCp(String cp) {
		this.cp = cp;
	}

	public String getMunicipio() {
		return municipio;
	}

	public void setMunicipio(String municipio) {
		this.municipio = municipio;
	}

	public String getProvincia() {
		return provincia;
	}

	public void setProvincia(String provincia) {
		this.provincia = provincia;
	}

	public String getCif() {
		return cif;
	}

	public void setCif(String cif) {
		this.cif = cif;
	}

	public String getContacto() {
		return contacto;
	}

	public void setContacto(String contacto) {
		this.contacto = contacto;
	}

	public String getTelefono() {
		return telefono;
	}

	public void setTelefono(String telefono) {
		this.telefono = telefono;
	}

	public String getNumCuenta() {
		return numCuenta;
	}

	public void setNumCuenta(String numCuenta) {
		this.numCuenta = numCuenta;
	}

	public Integer getFormaPago() {
		return formaPago;
	}

	public void setFormaPago(Integer formaPago) {
		this.formaPago = formaPago;
	}

	public Integer getPeriodicidad() {
		return periodicidad;
	}

	public void setPeriodicidad(Integer periodicidad) {
		this.periodicidad = periodicidad;
	}

	public Integer getDiaFacturacion() {
		return diaFacturacion;
	}

	public void setDiaFacturacion(Integer diaFacturacion) {
		this.diaFacturacion = diaFacturacion;
	}

	public Integer getMesHastaUltimaFacturacion() {
		return mesHastaUltimaFacturacion;
	}

	public void setMesHastaUltimaFacturacion(Integer mesHastaUltimaFacturacion) {
		this.mesHastaUltimaFacturacion = mesHastaUltimaFacturacion;
	}

	public Integer getAnyoHastaUltimaFacturacion() {
		return anyoHastaUltimaFacturacion;
	}

	public void setAnyoHastaUltimaFacturacion(Integer anyoHastaUltimaFacturacion) {
		this.anyoHastaUltimaFacturacion = anyoHastaUltimaFacturacion;
	}

	public BigDecimal getImporte() {
		return importe;
	}

	public void setImporte(BigDecimal importe) {
		this.importe = importe;
	}

	public boolean hasUltimaFacturacion() {
		return !(null == this.anyoHastaUltimaFacturacion || null==this.mesHastaUltimaFacturacion) ;
	}

	/**
	 * Devuelve true si a dia de lanzamiento el ayuntamiento tiene periodos de facturacion pendientes de facturar
	 * @return
	 */
	public boolean hasFacturacionPendiente() {
		LocalDate fechaInicioLanzamientoFacturacion  = LocalDate.of(this.getFechaProximaFacturacion().getYear(), this.getFechaProximaFacturacion().getMonthValue(), this.diaFacturacion).plusMonths(this.getPeriodicidad());
		return !LocalDate.now().isBefore(fechaInicioLanzamientoFacturacion);
	}
	
	/**
	 * Si no se han registrado aun plazos de facturacion para el ayuntamiento
	 * tratado, consideraremos que se factura desde enero del año en curso. Es
	 * decir, consideraremos que el mes y anyo hasta del ultimo plazo es diciembre
	 * del año en curso – 1.
	 * 
	 * @return
	 */
	public LocalDate getFechaUltimaFacturacion() {
		return LocalDate.of(hasUltimaFacturacion() ? this.anyoHastaUltimaFacturacion : (LocalDate.now().getYear() - 1),
				hasUltimaFacturacion() ? this.mesHastaUltimaFacturacion : 12, 1);
	}

	/**
	 * Sera el resultado de sumar la periodicidad indicada (n meses) a la fecha
	 * formada por el dia configurado en el propio ayuntamiento y el mes y anyo hasta
	 * del plazo encontrado + 1 (se cobra a mes vencido)
	 */
	public LocalDate getFechaProximaFacturacion() {		
		return  this.getFechaUltimaFacturacion().plusMonths(1);
	}
	

	public Date getfAutorizacion() {
		return fAutorizacion;
	}

	public void setfAutorizacion(Date fAutorizacion) {
		this.fAutorizacion = fAutorizacion;
	}

	public String getIdMunicipio() {
		return idMunicipio;
	}

	public void setIdMunicipio(String idMunicipio) {
		this.idMunicipio = idMunicipio;
	}

	public String getIdProvincia() {
		return idProvincia;
	}

	public void setIdProvincia(String idProvincia) {
		this.idProvincia = idProvincia;
	}

	@Override
	public String toString() {
		return "Ayuntamiento [idAyuntamiento=" + idAyuntamiento + ", descEs=" + descEs + ", descEu=" + descEu
				+ ", direccion=" + direccion + ", cp=" + cp + ", municipio=" + municipio + ", idMunicipio="
				+ idMunicipio + ", provincia=" + provincia + ", idProvincia=" + idProvincia + ", cif=" + cif
				+ ", contacto=" + contacto + ", telefono=" + telefono + ", numCuenta=" + numCuenta + ", formaPago="
				+ formaPago + ", fAutorizacion=" + fAutorizacion + ", periodicidad=" + periodicidad
				+ ", diaFacturacion=" + diaFacturacion + ", mesHastaUltimaFacturacion=" + mesHastaUltimaFacturacion
				+ ", anyoHastaUltimaFacturacion=" + anyoHastaUltimaFacturacion + ", importe=" + importe + "]";
	}
	
}
