package bbuvajava;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Serializable;
import java.text.DecimalFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList; 
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

public class Sucursal implements Serializable{
    private static final long serialVersionUID=1L;
    private List<Producto> mProducto;
    private List<Cliente> mCliente;
    private ArrayList<Remesa> mRemesa;
    private List<Empleado> mEmpleado;
    private List<Movimiento> mTExternas;
    private List<Caja> mCaja;
    private String localidad;
    private Caja actual;
    private Entidad ent;
    private String cif;// cif para las Remesas de transf externas
    private String id;
    public Sucursal () {
        mProducto=new ArrayList();
        mRemesa=new ArrayList();
        mCliente=new ArrayList();
        mCaja=new ArrayList();
        mEmpleado=new ArrayList();
        mTExternas=new ArrayList();
    }
 
    public List<Producto> getProducto () {
        return mProducto;
    }

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

    public List<Empleado> getMEmpleado() {
        return mEmpleado;
    }

    public List<Caja> getMCaja() {
        return mCaja;
    }

    public List<Cliente> getMCliente() {
        return mCliente;
    }

    public String getCif() {
        return cif;
    }
       
    public Entidad getEnt() {
        return ent;
    }

    public void setEnt(Entidad ent) {
        this.ent = ent;
    }

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

    public void setProducto (List<Producto> val) {
        this.mProducto = val;
    }

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

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

    public void setMEmpleado(ArrayList<Empleado> mEmpleado) {
        this.mEmpleado = mEmpleado;
    }

    public void setMCaja(ArrayList<Caja> mCaja) {
        this.mCaja = mCaja;
    }

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

    public void anadirProducto(Producto P){
        this.mProducto.add(P);
    }

    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 Producto get_Producto2(String n){
        Iterator iterador = this.mProducto.listIterator();
        while( iterador.hasNext() ) {
            Producto p = (Producto) iterador.next();
            if (p.getNumeroProducto().substring(10,20).compareTo(n)==0){
                return p;
            }
        }
        return null;
    }

    public Cliente get_Cliente(String n){
        Iterator iterador = this.getMCliente().listIterator();
        while( iterador.hasNext() ) {
            Cliente c = (Cliente) iterador.next();
            if ((c.getNombreCliente().compareTo(n)==0)){
                return c;
            }
        }
        return null;
    }

    public Cliente get_Cliente_nCuenta(String n){
        Iterator iterador = this.mProducto.listIterator();
        Cliente c=new Cliente();
        while( iterador.hasNext() ) {
            Producto p = (Producto) iterador.next();
            if ((p.getNumeroProducto().substring(10,20).compareTo(n)==0)){
                c=p.getMTitulares().get(0);
                return c;
            }
        }
        return null;
    }

    public Empleado getEmpleado(String n){
        Iterator iterador = this.mEmpleado.listIterator();
        while( iterador.hasNext() ) {
            Empleado e = (Empleado) iterador.next();
            if (e.getDni().compareTo(n)==0){
                return e;
            }
        }
        return null;
    }

    public Caja getCaja(int n){
        Iterator iterador = this.mCaja.listIterator();
        while( iterador.hasNext() ) {
            Caja c = (Caja) iterador.next();
            if (c.getId()==n){
                return c;
            }
        }
        return null;
    }

    public String verRemesaCargos(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);
                    String numCta=linea.substring(68,88);
                    resumenRemesa += "\t"+linea.substring(88,98);
                    if(this.get_Producto(numCta)==null)
                        resumenRemesa += "\t Esta cuenta no esta en la sucursal";
                 }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 Boolean cuadreCargos(String Path) throws ParseException{
          try{
                float sumaRemesa=0;
                float totalRemesa=0;
                Boolean cuadre;
                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("5680")==0){
                          //Registro individual obligatorio
                         DecimalFormat df1=new DecimalFormat("#######,##");
                         Number n=df1.parse(linea.substring(88, 98));
                         sumaRemesa+=(n.floatValue());
                     }
                     else if(buffer.compareTo("5980")==0){
                          //Registro total final
                          DecimalFormat df1=new DecimalFormat("#######,##");
                          Number n=df1.parse(linea.substring(88, 98));
                          totalRemesa=(n.floatValue());
                     }
                }
                System.out.println(totalRemesa+"=="+sumaRemesa);
                if(totalRemesa-sumaRemesa<=0.01){
                    cuadre=true;
                }
                else{
                    cuadre=false;
                }
                return cuadre;
          }catch (IOException ex) {
            System.out.println("Ha ocurrido una excepcion");
            Logger.getLogger(Sucursal.class.getName()).log(Level.SEVERE, null, ex);
            return false;
          }
    }

    public Boolean incorporarRemesaCargos(String Path) throws ParseException{
          try {
            if(this.cuadreCargos(Path)==true){
                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(c);
                            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);
            return true;
            }
            else return false;

            
        } catch (IOException ex) {
            Logger.getLogger(Sucursal.class.getName()).log(Level.SEVERE, null, ex);
            return false;
        }

}

   public String verRemesaAbonos(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("0306")==0){
                       //Registro cabecera presentador
                       buffer=linea.substring(26,29);
                       if(buffer.compareTo("001")==0){
                          //fechas,numcuenta
                          resumenRemesa+=" Envio: "+linea.substring(29,31)+"/"+linea.substring(31,33)+"/"+linea.substring(33,35);
                          resumenRemesa+=" Emision: "+linea.substring(35,37)+"/"+linea.substring(37,39)+"/"+linea.substring(39,41);
                       }
                       else if(buffer.compareTo("002")==0){
                          //nombreAbonador
                          resumenRemesa+="   "+linea.substring(29,58)+"\n\n";
                       }
                }
                else if(buffer.compareTo("0606")==0){
                      //Registro individual obligatorio
                      buffer=linea.substring(26,29);
                      if(buffer.compareTo("010")==0){
                          //importe,numcuenta
                          resumenRemesa+="\n    NºCuenta: "+linea.substring(41,59)+".  Importe: "+linea.substring(30,39)+","+linea.substring(39,41);
                          if(this.get_Producto2(linea.substring(49,59))==null)
                              resumenRemesa+="\t Esta cuenta no esta en la sucursal.";
                      }
                }
                else if(buffer.compareTo("0806")==0){
                     //Registro total final
                    resumenRemesa += "\n\n\tTotal Remesa: "+linea.substring(30,39)+","+linea.substring(39,41);
                 }
            }
        } catch (IOException ex) {
            Logger.getLogger(Sucursal.class.getName()).log(Level.SEVERE, null, ex);
        }
        return resumenRemesa;
    }

   public Boolean cuadreAbonos(String Path) throws ParseException{
          try{
                float sumaRemesa=0;
                float totalRemesa=0;
                Boolean cuadre;
                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("0606")==0){
                          //Registro individual obligatorio
                         buffer=linea.substring(26,29);
                         if(buffer.compareTo("010")==0){
                            DecimalFormat df1=new DecimalFormat("#######,##");
                            Number n=df1.parse(linea.substring(30, 39));
                            sumaRemesa+=(n.floatValue());
                            }
                     }
                     else if(buffer.compareTo("0806")==0){
                          //Registro total final
                          DecimalFormat df1=new DecimalFormat("#######,##");
                          Number n=df1.parse(linea.substring(30, 39));
                          totalRemesa=(n.floatValue());
                          System.out.println(n.floatValue()+","+totalRemesa);
                     }
                }
                System.out.println(totalRemesa+"=="+sumaRemesa);
                if(totalRemesa-sumaRemesa<=0.01){
                    cuadre=true;
                }
                else{
                    cuadre=false;
                }
                return cuadre;
          }catch (IOException ex) {
            System.out.println("Ha ocurrido una excepcion");
            Logger.getLogger(Sucursal.class.getName()).log(Level.SEVERE, null, ex);
            return false;
          }
    }

   public Boolean incorporarRemesaAbonos(String Path) throws ParseException{
          try {
               if(this.cuadreAbonos(Path)){ //Excepcion cuadre
                    FileReader fr = null;
                    fr = new FileReader(Path);
                    BufferedReader bf = new BufferedReader(fr);
                    String linea;
                    String concepto="";
                    String importe="";
                    String fechaRemesa="";
                    String numCta="";
                    Remesa r=new Remesa();
                    String cuenta="";
                    Cliente c=new Cliente();
                    while ((linea = bf.readLine()) != null) {
                        String buffer;
                        buffer = linea.substring(0, 4);

                        if(buffer.compareTo("0306")==0){
                            //registro cabecera presentador
                            buffer = linea.substring(26,29);
                            if(buffer.compareTo("001")==0){
                            cuenta=linea.substring(48,58);
                            fechaRemesa=linea.substring(35,41);
                            }
                            else if(buffer.compareTo("002")==0){
                             c=get_Cliente_nCuenta(cuenta);
                                 if(c!=null)r.setOrdenante(c);
                                 else System.out.println("Error primero");
                             }
                        }
                        if(buffer.compareTo("0606")==0){
                            // registro beneficiario
                            buffer = linea.substring(26,29);
                            if(buffer.compareTo("010")==0){
                                 importe=linea.substring(30,39);
                                 numCta=linea.substring(49,59);
                            }
                            else if(buffer.compareTo("016")==0){
                                 concepto=linea.substring(29,58);
                                OPRemesa op=new OPRemesa(c);
                                DecimalFormat df1=new DecimalFormat("#######,##");
                                Number n=df1.parse(importe);
                                op.setImporte(n.floatValue());
                                op.setDescripcion(concepto);
                                SimpleDateFormat df2=new SimpleDateFormat("ddMMyy");
                                op.setFechaOperacion(df2.parse(fechaRemesa));
                                r.insertarOPRemesa(op);
                                Producto auxCta=this.get_Producto2(numCta);
                                if(auxCta!=null){
                                     auxCta.abono(op);
                                    // Añadir a domicializacion a Producto
                                    Domicializacion D=new Domicializacion(auxCta,c);
                                    auxCta.anadirDomicializacion(D);
                                }
                                else System.out.println("Error");
                                  
                        }
                }
            }
            this.anadirRemesa(r);
            return true;
       }
       else return false;

        } catch (IOException ex) {
            Logger.getLogger(Sucursal.class.getName()).log(Level.SEVERE, null, ex);
            System.out.println("Se ha producido una excepcion al validar la remesa.");
            return false;
        }

}

   public void CrearRemesaTransferenciasExternas(String Path) throws IOException, ParseException{
      String sFichero = Path;
      File fichero = new File(sFichero);
      if (fichero.exists()==false) {
             BufferedWriter bw = new BufferedWriter(new FileWriter(sFichero));
             bw.write("0306 ");
             bw.write(this.getCif());
             bw.write("            001");
             Date a=new Date();
             String dia=String.valueOf(a.getDate());
             String mes=String.valueOf(a.getMonth());
             String anio=String.valueOf(a.getYear());
             String fecha=(dia+mes+anio);
             bw.write(fecha);
             bw.write(fecha);
             bw.write("********************  **");
             bw.newLine();
             bw.write("0306 ");
             bw.write(this.getCif());
             bw.write("            002BANCOBBUVASUCURSAL\n"+this.getId());
             float importeTotal=0;
             for(int i=0;i<mTExternas.size();i++){
                 bw.newLine();
                 bw.write("0606 "+this.getCif());
                 bw.write("            010");
                 TransferenciaExterna E;
                 E=(TransferenciaExterna) this.mTExternas.get(i);
                 String importe= E.getCantidad();
                 float im=Float.parseFloat(importe);
                 importeTotal+=im;
                 System.out.println(importe);
                 int dif=12-importe.length();
                 System.out.println(String.valueOf(dif));
                 for(int j=0;j<dif;j++){
                     bw.write("0");
                 }
                 for(int z=0;z<importe.length();z++){
                     if(importe.charAt(z)!='.')
                         bw.write(importe.charAt(z));
                     
                 }
                 bw.write(E.getDestino());
                 bw.write(" **");
             }
             bw.newLine();
             bw.write("0806 ");
             bw.write(this.getCif());
             bw.write("               ");
             String importeT=String.valueOf(importeTotal);
             int dif2=12-importeT.length();
             for(int j=0;j<dif2;j++){
                  bw.write("0");
             }
              for(int u=0;u<importeT.length();u++){
                     if(importeT.charAt(u)!='.'){
                         bw.write(importeT.charAt(u));
                         System.out.println(importeT.substring(u,u+1));
                         System.out.println(importeT);
                     }
              }
             //bw.write(importeT);
             bw.close();
             
      }
   }

   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("Transfiere el importe de la cuenta origen a la cuenta destino de la misma entidad.");
            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,String des){
        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(origen,des,String.valueOf(importe));
           importe+=comision;
           mov.setImporte(importe);
           mov.setDescripcion("Transfiere el importe de la cuenta origen a la cuenta destino de otra entidad.");
           mov.setConcepto("TransferenciaExterna");
           mTExternas.add(mov);
           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();
        String uProducto;
        String primerosD;
        String ultimosD;
        int nproducto;
        String nuevoNproducto;
        if(mProducto.size()!=0){
             ultimoProducto=mProducto.get(aux-1);
             uProducto=ultimoProducto.getNumeroProducto();
             primerosD=uProducto.substring(0,16);
             ultimosD=uProducto.substring(16,20);
             nproducto=(int)Float.parseFloat(ultimosD);
             nproducto+=1;
             nuevoNproducto=String.valueOf(nproducto);
        }
        else{
            primerosD="209840021610000";
            nuevoNproducto="00001";

        }

        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(primerosD+nuevoNproducto);
        p.setSaldo(saldo);
        ControladoraBD BD=new ControladoraBD();
        if(this.get_Cliente(titular)==null){
             ClienteFisico c;
             c=new ClienteFisico();
             c.setNombreCliente(titular);
             c.setDni(dni);
             c.insertaProductoenCliente(p);
             p.insertaTitularenProducto(c);
             getMCliente().add(c);// habria que añadirlo si no esta ya añadido
             BD.persist(c);
        }
        else {
            Cliente c;
            c=this.get_Cliente(titular);
            c.insertaProductoenCliente(p);
            p.insertaTitularenProducto(c);
            BD.actualizar(c);
        }
       mProducto.add(p);
    }

    public String VerCuentas(){
        String dev="";
        Iterator iterador = this.mProducto.listIterator();
        while( iterador.hasNext() ) {
            Producto p = (Producto) iterador.next();
            Cliente c=p.getMTitulares().get(0);
            dev+="NCuenta: ";
            dev+=" ";
            dev+=p.getNumeroProducto();
            dev+="    ";
            dev+="Cliente: ";
            dev+=" ";
            dev+=c.getNombreCliente();
            dev+="    ";
            dev+="saldo: ";
            dev+=" ";
            dev+=String.valueOf(p.getSaldo());
            dev+="\n";
        }
        return dev;
    }

   
    public String getId() {
        return id;
    }

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


    public String getLocalidad() {
        return localidad;
    }


    public void setLocalidad(String localidad) {
        this.localidad = localidad;
    }

    public Caja getActual() {
        return actual;
    }

    public void setActual(String e) {
        this.actual =getEmpleado(e).getCaj();
    }

    public Caja asignarCajanueva(int id){
       if(this.getCaja(id)==null){
        Caja caj=new Caja();
        caj.setId(id);
        caj.setSaldo(0);
        mCaja.add(caj);
        return caj;
        }
       else{
           return null;
       }
    }
    public void nuevoEmpleado(Empleado e,Caja c){
        e.setCaj(c);
        c.setE(e);
        mEmpleado.add(e);
    }

    public String verEmpleados(){
        String dev = "";
        Iterator iterador = this.mEmpleado.listIterator();
        while( iterador.hasNext() ) {
            Empleado e = (Empleado) iterador.next();
                dev+="Empleado dni: ";
                dev+=e.getDni();
                dev+="    ";
                dev+=" Nombre: ";
                dev+=e.getNombre();
                dev+="    ";
                dev+=" ¿director? : ";
                dev+=String.valueOf(e.getDirector());
                dev+=" caja asignada ";
                dev+=String.valueOf(e.getCaj().getId());
                dev+="    ";
                dev+="\n";
        }
        return dev;
    }

    public void anadir_Cliente(Cliente c){
        mCliente.add(c);
    }

    public void persistencia(){
        //ControladoraBD BD=new ControladoraBD();
        //BD.persist(this);
        //for(int i=0;i<this.mCliente.size();i++)
           // BD.persist(mCliente.get(i));
        //for(int j=0;j<this.mProducto.size();j++)
        //BD.persist(mProducto.get(j));

    }
    public void query(){
        ControladoraBD BD=new ControladoraBD();
        mCliente=BD.getData_Cliente();
        mProducto=BD.getData_Producto();
    }

}

