package bbuvajava;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.text.DecimalFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList; 
import java.util.Iterator;
import java.util.logging.Level;
import java.util.logging.Logger;

public class Sucursal {


    private ArrayList<Producto> mProducto;
    private ArrayList<Remesa> mRemesa;
    private ArrayList<Cliente> mCliente;

   
    public Sucursal () {
        mProducto=new ArrayList();
        mRemesa=new ArrayList();
        mCliente=new ArrayList();
    }
 
    public ArrayList<Producto> getProducto () {
        return mProducto;
    }
  
    public void setProducto (ArrayList<Producto> val) {
        this.mProducto = val;
    }

    public Producto get_Producto(String n){
        Iterator iterador = this.mProducto.listIterator();
        while( iterador.hasNext() ) {
            Producto p = (Producto) iterador.next();
            if (p.getNumeroProducto().compareTo(n)==0){
                return p;
            }
        }
        return null;
    }

    public ArrayList<Remesa> getMRemesa() {
        return mRemesa;
    }

    public void setMRemesa(ArrayList<Remesa> mRemesa) {
        this.mRemesa = mRemesa;
    }

    public String verRemesa(String Path) throws IOException{
        String resumenRemesa="";
        try {
            FileReader fr = null;
            fr = new FileReader(Path);
            BufferedReader bf = new BufferedReader(fr);
            String linea, buffer;

            while ((linea = bf.readLine()) != null) {
                buffer=linea.substring(0,4);
                if(buffer.compareTo("5180")==0){
                    //Registro cabecera presentador
                    resumenRemesa=linea.substring(28,69);
                }else if(buffer.compareTo("5680")==0){
                    //Registro individual obligatorio
                    resumenRemesa += "\n"+linea.substring(28,68);
                    resumenRemesa += "\t"+linea.substring(88,98);
                 }else if(buffer.compareTo("5980")==0){
                     //Registro total final
                    resumenRemesa += "\nTotal Remesa: "+linea.substring(88,98);
                 }
            }
        } catch (IOException ex) {
            Logger.getLogger(Sucursal.class.getName()).log(Level.SEVERE, null, ex);
        }
        return resumenRemesa;
    }

    public void anadirRemesa(Remesa R){
           this.mRemesa.add(R);
    }

    public void anadirProducto(Producto P){
         this.mProducto.add(P);
    }
    public void incorporarRemesa(String Path) throws ParseException{
          try {
            FileReader fr = null;
            fr = new FileReader(Path);
            BufferedReader bf = new BufferedReader(fr);
            String linea;
            String fechaRemesa="";
            String numCta="";
            Remesa r=new Remesa();
             Cliente c=new Cliente();
            while ((linea = bf.readLine()) != null) {
                String buffer;
                buffer = linea.substring(0, 4);
                
                if(buffer.compareTo("5180")==0){
                    //registro cabecera presentador
                    c.setNombreCliente(linea.substring(28,68));
                    r.setOrdenante(c);
                    }else if(buffer.compareTo("5380")==0){
                        fechaRemesa=linea.substring(22, 28);
                    }else if(buffer.compareTo("5680")==0){
                        OPRemesa op=new OPRemesa();
                        DecimalFormat df1=new DecimalFormat("#######,##");
                        Number n=df1.parse(linea.substring(88, 98));
                        op.setImporte(n.floatValue());
                        op.setConcepto(r.getOrdenante().getNombreCliente());
                        SimpleDateFormat df2=new SimpleDateFormat("ddMMyy");
                        op.setFechaOperacion(df2.parse(fechaRemesa));
                        r.insertarOPRemesa(op);
                        //leo el numcta
                        numCta=linea.substring(68,88);
                        Producto auxCta=this.get_Producto(numCta);
                        if(auxCta!=null){
                           auxCta.cargo(op);
                          // Añadir a domicializacion a Producto
                           Domicializacion D=new Domicializacion(auxCta,c);
                           auxCta.anadirDomicializacion(D);
                        }
                     }

              }
            this.anadirRemesa(r);
        } catch (IOException ex) {
            Logger.getLogger(Sucursal.class.getName()).log(Level.SEVERE, null, ex);
        }

}


   public void hacerTransferenciaInterna(float importe,Producto origen,Producto destino){

          if(origen.getSaldo()>importe){

            Movimiento mov=new TransferenciaInterna(origen.getNumeroProducto(),destino.getNumeroProducto());
            mov.setImporte(importe);
            mov.setConcepto("TransferenciaInterna");
            mov.setDescripcion("La descripcion del producto para el cu detallado");
            destino.anadirMovimiento(mov);
            origen.anadirMovimiento(mov);
            origen.decrementoSaldo(importe);
            destino.incrementoSaldo(importe);
        }
          else
             System.out.println("No se puede, ya que el saldo de la cuenta origen es inferior a la cantidad indicada");
    } 

   public void hacerTransferenciaExterna(float importe,Producto origen){
        if(origen.getSaldo()>importe + 0.1*importe){
           double comision;
           if(importe*0.1>1)comision=importe*0.1;
           else comision=1;
           Movimiento mov=new TransferenciaExterna();
           importe+=comision;
           mov.setImporte(importe );
           mov.setConcepto("TransferenciaExterna");
           origen.anadirMovimiento(mov);
           origen.decrementoSaldo(importe );
        }

        else System.out.println("NO tiene el saldo suficiente");
    }
    public void AltaProducto(float saldo,String titular,String dni,String tipo){
        Producto ultimoProducto;
        int aux=mProducto.size();
        ultimoProducto=mProducto.get(aux-1);
        String uProducto=ultimoProducto.getNumeroProducto();
        Producto p = null;
        if(tipo.equalsIgnoreCase("CuentaCorriente")){
             p=new CuentaCorriente();
        }
        else if(tipo.equalsIgnoreCase("LibretaAhorro"))
        {
             p=new LibretaAhorro();
        } 
        else if(tipo.equalsIgnoreCase("PrestamoPersonal")){
             p=new PrestamoPersonal();
        }
        else if(tipo.equalsIgnoreCase("PrestamoHipotecario")){
             p=new PrestamoHipotecario();
        }

        p.setNumeroProducto(uProducto.toString()+1);
        p.setSaldo(saldo);
        
        if(this.get_Cliente(titular)==null){
             ClienteFisico c;
             c=new ClienteFisico();
             c.setNombreCliente(titular);
             c.setDni(dni);
             c.insertaProductoenCliente(p);
             p.insertaTitularenProducto(c);
             mCliente.add(c);// habria que añadirlo si no esta ya añadido
        } 
        else {
            Cliente c;
            c=this.get_Cliente(titular);
            c.insertaProductoenCliente(p);
            p.insertaTitularenProducto(c);
        }
        



        mProducto.add(p);

    }

    void setMCliente(ArrayList<Cliente> AC) {
       this.mCliente=AC;
    }

    public Cliente get_Cliente(String n){
        Iterator iterador = this.mCliente.listIterator();
        while( iterador.hasNext() ) {
            Cliente c = (Cliente) iterador.next();
            if (c.getNombreCliente().compareTo(n)==0){
                return c;
            }
        }
        return null;
    }
    public void VerCuentas(){
        Iterator iterador = this.mProducto.listIterator();
        while( iterador.hasNext() ) {
            Producto p = (Producto) iterador.next();
            Cliente c=p.getMTitulares().get(0);
            System.out.println(p.getNumeroProducto());
            System.out.println(c.getNombreCliente());
            System.out.println(p.getSaldo()+"\n");
        }
    }


}

