package bbuvajava;

import java.io.Serializable;
import java.util.ArrayList; 
import java.util.Iterator;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Transient;

@Entity
public class Producto implements Serializable {
    private static final long serialVersionUID=1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private String numeroProducto; 
    private float saldo;          
    @Transient
    private List<Movimiento> mMovimiento;
    @OneToMany(cascade=CascadeType.ALL)
    private List<Cliente> mTitulares;
    @Transient
    private List<Domicializacion> mDomicializaciones;
    

    public Producto () {
        mMovimiento=new ArrayList();
        mTitulares=new ArrayList();
        mDomicializaciones=new ArrayList();
    }

    public List<Movimiento> getMovimiento () {
        return mMovimiento;
    }
    
    public String getNumeroProducto() {
        return numeroProducto;
    }
    
    public List<Domicializacion> getMDomicializaciones() {
        return mDomicializaciones;
    }

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

    public float getSaldo() {
        return saldo;
    }

    public void setSaldo(float saldo) {
        this.saldo = saldo;
    }

    public void setMovimiento (ArrayList<Movimiento> val) {
        this.mMovimiento = val;
    }

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

    public void setMDomicializaciones(ArrayList<Domicializacion> mDomicializaciones) {
        this.mDomicializaciones = mDomicializaciones;
    }

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

    public void anadirDomicializacion(Domicializacion D) {
        getMDomicializaciones().add(D);
    }

    public void anadirMovimiento(Movimiento M){ 
        this.mMovimiento.add(M);
    }

    public Movimiento get_Movimiento(int n) {
        if(n>0){
             int x=n-1;
             if(x<mMovimiento.size()){
                 Movimiento m=new Movimiento();
                 m=mMovimiento.get(x);
                 return m;
             }
             else{
                 return null;
             }
        }
        else {
              return null;
        }
    }
    
    public void ingreso(float c){
         if(c>0){
             String t="Ingreso";
             Movimiento ingreso= new OPBasica(c,t);
             incrementoSaldo(c);
             anadirMovimiento(ingreso);
         }
    }

    public void reintegro(float c){
         if(c>0){
             String t="Reintegro";
             Movimiento reintegro= new OPBasica(c,t);
             decrementoSaldo(c);
             anadirMovimiento(reintegro);
         }
    }

    public void cargo(OPRemesa c){
         c.setConcepto("Cargo");
         decrementoSaldo(c.getImporte());
         anadirMovimiento(c);
    }

    public void abono(OPRemesa a){
         a.setConcepto("Abono");
         incrementoSaldo(a.getImporte());
         anadirMovimiento(a);
    }

    public void decrementoSaldo(float saldo){  
        if(this.saldo>=saldo && saldo>0){
           this.saldo -= saldo;
        }
    }

    public void incrementoSaldo(float saldo){  
        if(saldo>0){
        this.saldo +=saldo;
        }
    }

    public void insertaTitularenProducto(Cliente c1) {
        getMTitulares().add(c1);
    }

    public String mostrar_nmovimientos(int num){
        String aux="";
        int n=0;
        int i;
        int ultimo=this.mMovimiento.size()-1;
        if(num>0){
             if(mMovimiento.size()>0){
                  while(n<num) {
                      Movimiento m = mMovimiento.get(ultimo);
                      i=ultimo+1;
                      aux+="\n    Nº Movimiento "+i+": "+m.getConcepto();
                      aux+="  "+m.getImporte();
                      n++;
                      ultimo--;
                  }
                  aux+="\n\n\tNº Total de movimientos: "+num;
             }
             else{
                 aux="No hay ningun movimiento en la cuenta.";
             }
         }
         return aux;
    }

    public String mostrar_domicializaciones() {
        String aux="";
        int i=0;
        Iterator iterador = this.getMDomicializaciones().listIterator();
        if(getMDomicializaciones().size()!=0){
            while( iterador.hasNext() ) {
                Domicializacion d = (Domicializacion) iterador.next();
                i++;
                aux+="\nDom"+i+":  Ordenante: "+d.getC().getNombreCliente();
            }
        }
        else{
            aux="\n\tEsta cuenta no tiene domicializaciones.";
        }
        return aux;
     }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String verClientes(){
        String dev=" ";
        Iterator iterador = this.mTitulares.listIterator();
        while( iterador.hasNext() ) {
            Cliente c = (Cliente) iterador.next();
                dev+="titular : ";
                dev+=c.getNombreCliente();
                dev+="  \n  ";
        }
        return dev;
    }

    public Cliente getCliente(String dni){
        Iterator iterador = this.mTitulares.listIterator();
        while( iterador.hasNext() ) {
            Cliente c = (Cliente) iterador.next();
                if(c.getDni().equals(dni))
                return c;
        }
        return null;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (id != null ? id.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.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
            return false;
        }
        return true;
    }

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

}

