package Hito4;

import java.io.Serializable;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList; 
import java.util.Iterator;
import java.util.List;
import javax.persistence.*;

// <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
// #[regen=yes,id=DCE.9CB3B596-7460-CA70-6938-51377C1D0232]
// </editor-fold>
@Entity
public class Producto  implements Serializable{

    private static final long serialVersionUID = 1L;
    @Id
    private String numeroProducto;//numero de cuenta

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.479A584C-0B26-58D7-0828-5F6B23CA2257]
    // </editor-fold>
    private String tipoProducto;//c para cuentas
                                    //l para libretas
                                    // p para prestamo personal
                                    //h prestamo hipotecario

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.E32B2849-F57B-DEA1-558C-211753FB46C6]
    // </editor-fold> 
    private double saldo;
    @ManyToMany(cascade=CascadeType.ALL)
    private List<Cliente> mTitulares;
    
    @Transient//@OneToMany// <editor-fold defaultstate="collapsed" desc=" UML Marker ">
    // #[regen=yes,id=DCE.29BDEB08-CEB8-47FD-36A7-13A153BC5EE5]
    // </editor-fold> 
    private List<Movimiento> mMovimiento;
    @Transient//@OneToMany
    private List<Domiciliacion> mDomiciliacion;

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.AE98041C-450C-0F91-1AAF-DCD563B80301]
    // </editor-fold> 
    public Producto () {
        mMovimiento=new ArrayList();
        mTitulares=new ArrayList();
    }

    public String getId() {
        return numeroProducto;
    }

    public void setId(String numeroProducto) {
        this.numeroProducto = numeroProducto;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (numeroProducto != null ? numeroProducto.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Producto)) {
            return false;
        }
        Producto other = (Producto) object;
        if ((this.numeroProducto == null && other.numeroProducto != null) || (this.numeroProducto != null && !this.numeroProducto.equals(other.numeroProducto))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "Hito4.Producto[id=" + numeroProducto + "]";
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,regenBody=yes,id=DCE.DAA5C5A9-131A-28DB-AFF3-0D75E12592C5]
    // </editor-fold> 
    public List<Movimiento> getMovimiento () {
        return getMMovimiento();
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,regenBody=yes,id=DCE.9B33FD51-C4C2-5AFE-18B5-AC75C82AFF75]
    // </editor-fold> 
    public void setMovimiento (List<Movimiento> val) {
        this.setMMovimiento(val);
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,regenBody=yes,id=DCE.0F5C0876-7EF8-3C78-3852-FF69A70A2A99]
    // </editor-fold> 
    public String getNumeroProducto () {
        return numeroProducto;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,regenBody=yes,id=DCE.69304E9A-DF95-CF7E-BF77-DC37B0B6CD34]
    // </editor-fold> 
    public void setNumeroProducto (String val) {
        this.numeroProducto = val;
    }

    public void insertaMovimientoenCuenta(Movimiento mov){
        this.getMMovimiento().add(mov);
    }

    public double getSaldo() {
        return saldo;
    }

    public void setSaldo(double saldo) {
        this.saldo = saldo;
    }
    
    public void reintegro(double cantidad){
        if(this.getSaldo()>=cantidad){
            this.setSaldo(this.getSaldo()-cantidad);
        }else{
            System.out.println("Saldo insuficiente");
        }
    }

    public void ingreso(double  cantidad){
        if(cantidad>0){
            this.setSaldo(this.getSaldo()+cantidad);
        }
    }
    public boolean transferencia(Sucursal s,Producto origen,Producto destino, String concepto,String fecha,Double importe,Double comision) throws ParseException{
        boolean valor=true;
        Movimiento m = new Movimiento();
        OP_Transferencia opt=new OP_Transferencia();
        comision=importe*comision;
        SimpleDateFormat sdf= new SimpleDateFormat("dd-MM-yyyy");
        java.util.Date d=sdf.parse(fecha);

        if(origen.getSaldo() < (importe+comision)){valor=false;}
        if(valor)
        {
            origen.setSaldo(origen.getSaldo()-(importe+comision));
            m.setConcepto(concepto);
            m.setConceptoAmpliado(concepto);
            m.setFechaOperacion(d);
            Double i=(importe+comision)-((importe+comision)*2);//para que nos quede un numero negativo
            m.setImporte(i);
            origen.insertaMovimientoenCuenta(m);

            destino.setSaldo(destino.getSaldo()+importe);
            m.setConcepto(concepto);
            m.setConceptoAmpliado(concepto);
            m.setFechaOperacion(d);
            m.setImporte(importe);
            destino.insertaMovimientoenCuenta(m);

            opt.setConcepto(m.getConcepto());
            opt.setConceptoAmpliado(m.getConceptoAmpliado());
            opt.setFechaOperacion(m.getFechaOperacion());
            opt.setImporte(m.getImporte());
            opt.setOrigen(origen.getNumeroProducto());
            opt.setDestino(destino.getNumeroProducto());
            s.añadeTransferencia(opt);
        }
        return valor;
    }

    public List<Cliente> getMTitulares() {
        return mTitulares;
    }

    public void setMTitulares(List<Cliente> mTitulares) {
        this.mTitulares = mTitulares;
    }

    public void insertaTitularenProducto(Cliente c){
        this.mTitulares.add(c);
    }

    /**
     * @return the tipoProducto
     */
    public String getTipoProducto() {
        return tipoProducto;
    }

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

    /**
     * @return the mDomicilacion
     */
    public List<Domiciliacion> getMDomiciliacion() {
        return getMDomiciliacion();
    }

    /**
     * @param mDomicilacion the mDomicilacion to set
     */
    public void setMDomiciliacion(List<Domiciliacion> mDomiciliacion) {
        this.setMDomiciliacion(mDomiciliacion);
    }

    public void insertaDomiciliacion(Domiciliacion d){
        getMDomiciliacion().add(d);
    }

    public Domiciliacion DomiciliaciondeCuenta(String numcta){
        Iterator iterador = this.getMDomiciliacion().listIterator();
        while( iterador.hasNext() ) {
            Domiciliacion d = (Domiciliacion) iterador.next();
            if (d.getP().getNumeroProducto().compareTo(numcta)==0){
                return d;
            }
        }
        return null;
    }

    /**
     * @return the mMovimiento
     */
    public List<Movimiento> getMMovimiento() {
        return mMovimiento;
    }

    /**
     * @param mMovimiento the mMovimiento to set
     */
    public void setMMovimiento(List<Movimiento> mMovimiento) {
        this.mMovimiento = mMovimiento;
    }

    public void remesasaldo(Double importe){
        this.saldo+=importe;
    }

}

