package javacgc;


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.Date;
import java.util.Iterator;
import java.util.logging.Level;
import java.util.logging.Logger;





// <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
// #[regen=yes,id=DCE.9C47D96A-1F58-ECBE-7EC8-79E3D52BF320]
// </editor-fold> 
public class Sucursal {

private ArrayList<Cliente> mCliente;
    // <editor-fold defaultstate="collapsed" desc=" UML Marker ">
    // #[regen=yes,id=DCE.CCE7B794-EEC2-E51D-090A-EF54668557D7]
    // </editor-fold>
    private ArrayList<Producto> mProducto;

    private String ncta="0000000001";;

    private String numofic="2098400214";

    // <editor-fold defaultstate="collapsed" desc=" UML Marker ">
    // #[regen=yes,id=DCE.E01E5E9F-EBE7-C7F6-06A3-276488D66B9B]
    // </editor-fold>
    private ArrayList<Remesa> mRemesa;

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.797F1DEF-10ED-2F15-35DE-913EC5F8AED3]
    // </editor-fold> 
    private ArrayList<Caja> mCaja;

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.855754AD-4B99-C6C8-EDF0-EA45074BFEF9]
    // </editor-fold> 
    private ArrayList<Empleado> mEmpleado;

    private Caja Ccentral;

    private Director director;

    private int id=0;

    public Sucursal () {
        mCliente=new ArrayList<Cliente>();
        mProducto=new ArrayList<Producto>();
        mRemesa=new ArrayList<Remesa>();
        mCaja=new ArrayList<Caja>();
        mEmpleado=new ArrayList<Empleado>();
    }

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

    // <editor-fold defaultstate="collapsed" desc=" UML Marker ">
    // #[regen=yes,regenBody=yes,id=DCE.218C1D65-7D8D-33BA-80B9-B63AE1BC0066]
    // </editor-fold>
    public ArrayList<Remesa> getRemesa () {
        return mRemesa;
    }


    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,regenBody=yes,id=DCE.608BD037-6484-FC95-407E-FB60B1D3FA95]
    // </editor-fold> 
    public ArrayList<Producto> getProducto () {
        return mProducto;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker ">
    // #[regen=yes,regenBody=yes,id=DCE.226D8FCE-4245-D189-4E95-4F82BE9B8F25]
    // </editor-fold>
    public void setProducto (ArrayList<Producto> val) {
        this.mProducto = val;
    }
    public Producto devuelveProducto(String numcta){

        Iterator iterador = this.mProducto.listIterator();

        while( iterador.hasNext() ) {
            Producto p = (Producto) iterador.next();
            if (p.getNumeroProducto().compareTo(numcta)==0){
                return p;
            }

        }
        return null;
                                                   }
   



    public String verRemesa (String path) {
        if(path==null){return null;}
       else{
        String resumenRemesa="";
        try {
            FileReader fr = null;
            fr = new FileReader(path);
            BufferedReader bf = new BufferedReader(fr);
            String linea, buffer,buffer2;

            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);
                    resumenRemesa += "\t"+linea.substring(114,154);
                 }
                else if(buffer.compareTo("5681")==0){
                    //Primero opcional
                    resumenRemesa += linea.substring(28,68);
                    resumenRemesa += "\n"+linea.substring(68,108);
                //    resumenRemesa += "\t"+linea.substring(108,148);
                 }
                else if(buffer.compareTo("5682")==0){
                    //Segundo opcional
                    resumenRemesa += "\n"+linea.substring(28,68);
                    resumenRemesa += "\t"+linea.substring(68,108);
                    resumenRemesa += "\n"+linea.substring(108,148);
                 }
                else if(buffer.compareTo("5683")==0){
                    //Tercero opcional
                    resumenRemesa += "\t"+linea.substring(28,68);
                    resumenRemesa += "\n"+linea.substring(68,108);
                    resumenRemesa += "\t"+linea.substring(108,148);
                 }
                else if(buffer.compareTo("5684")==0){
                    //Cuarto opcional
                    resumenRemesa += "\n"+linea.substring(28,68);
                    resumenRemesa += "\t"+linea.substring(68,108);
                    resumenRemesa += "\n"+linea.substring(108,148);
                 }
                else if(buffer.compareTo("5685")==0){
                    //Quinto opcional
                    resumenRemesa += "\t"+linea.substring(28,68);
                    resumenRemesa += "\n"+linea.substring(68,108);
                    resumenRemesa += "\t"+linea.substring(108,148);
                 }
                else if(buffer.compareTo("5686")==0){
                    //Sexto opcional
                    resumenRemesa += "\n"+linea.substring(28,68);
                    resumenRemesa += "\t"+linea.substring(68,108);
               //     resumenRemesa += "\t"+linea.substring(108,148);
                 }
                else if(buffer.compareTo("5980")==0){
                     //Registro total final
                    resumenRemesa += "\nTotal Remesa: "+linea.substring(88,98);
                 }
                else if(buffer.compareTo("0356")==0){
                    buffer2=linea.substring(27, 30);
                    if(buffer2.compareTo("002")==0){
                       resumenRemesa += "\n"+linea.substring(29,73);
                    }
                    else if(buffer2.compareTo("003")==0){
                       resumenRemesa += "\t"+linea.substring(29,73);
                    }
                    else if(buffer2.compareTo("004")==0){
                       resumenRemesa += "\t"+linea.substring(29,73);
                    }}
                else if(buffer.compareTo("0656")==0){
                    buffer2=linea.substring(27, 30);
                    if(buffer2.compareTo("010")==0){
                       resumenRemesa += "\n"+linea.substring(29,43);
                    }
                    else if(buffer2.compareTo("011")==0){
                       resumenRemesa += "\t"+linea.substring(29,73);
                    }

                }
            }
        } catch (IOException ex) {
            Logger.getLogger(Sucursal.class.getName()).log(Level.SEVERE, null, ex);
        }
        return resumenRemesa;
    }
    }
    // <editor-fold defaultstate="collapsed" desc=" UML Marker ">
    // #[regen=yes,id=DCE.F68A8278-4F50-7C25-5F67-3AD08FB3712A]
    // </editor-fold>
    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();
            while ((linea = bf.readLine()) != null) {
                String buffer;
                buffer = linea.substring(0, 4);

                if(buffer.compareTo("5180")==0){
                    //registro cabecera presentador

                    r.setNombreOrdenante(linea.substring(28,68));
                }else if(buffer.compareTo("5380")==0){
                    fechaRemesa=linea.substring(22, 28);
                }else if(buffer.compareTo("5680")==0){
                    OpRemesas op=new OpRemesas();
                    DecimalFormat df1=new DecimalFormat("#######,##");
                    Number n=df1.parse(linea.substring(88, 98));
                    op.setImporte(-(int) n.floatValue());
                    op.setConceptoAmpliado(r.getNombreOrdenante());
                    op.setConceptobreve("Remesa");
                    SimpleDateFormat df2=new SimpleDateFormat("ddMMyy");
                    op.setFechaOperacion(df2.parse(fechaRemesa));
                    op.setId(Movimiento.idsc++);
                    r.insertaopremesa(op);
                    //leo el numcta
                    numCta=linea.substring(68,88);

                     //devuelveproducto(numcta)
                    Producto auxCta=this.devuelveProducto(numCta);
                    //insertarmovimientoensuproducto
                    if(auxCta!=null){ auxCta.insertaMovimientoenCuenta(op);}
                    //auxCta.insertaMovimientoenCuenta(op);

                    Cliente c=this.buscarCliente(r.getNombreOrdenante());
                    if(auxCta!=null){
                        Domiciliacion dom;
                        auxCta.insertaMovimientoenCuenta(op);
                        dom=auxCta.getDomiciliacion(r.getNombreOrdenante());
                        if(dom==null){
                            dom=new Domiciliacion();
                            
                            if(c==null){
                                c=new Cliente();
                                c.setDocumentacion(r.getNombreOrdenante());
                                c.setNombreCliente(r.getNombreOrdenante());
                            }
                            dom.setEmpresaOrdenante(c);
                            dom.setCuentaCargo(auxCta);
                            auxCta.insertardomic(dom);
                        }
                    }
                }
            }
            this.insertaRemesaenSucursal(r);
        } catch (IOException ex) {
            Logger.getLogger(Sucursal.class.getName()).log(Level.SEVERE, null, ex);
        }

}

    public void insertaRemesaenSucursal(Remesa r){
        this.mRemesa.add(r);
    }
     public ArrayList<Cliente> getMCliente() {
        return mCliente;
    }

    /**
     * @param mCliente the mCliente to set
     */
    public void setMCliente(ArrayList<Cliente> mCliente) {
        this.mCliente = mCliente;
    }

    public ArrayList<Producto> busquedaProductosCliente(String datosClte){
        //ArrayList<Producto> AP=new ArrayList();

        //ArrayList<Cliente> c=this.getMCliente();
        Iterator it = this.mCliente.listIterator();
        while (it.hasNext()) {
            Cliente c = (Cliente)it.next();
            System.out.println(c.getDocumentacion());
            if (c.getDocumentacion().compareToIgnoreCase(datosClte) == 0) {
                return c.getMProducto();
            }
        }
        return null;


    }


    public Cliente buscarCliente(String s) {
        Iterator it = this.mCliente.listIterator();
        while (it.hasNext()) {
            Cliente c = (Cliente)it.next();
            if (c.getDocumentacion().compareToIgnoreCase(s) == 0) {
                return c;
            }
        }
        return null;
    }

    /**
     * @return the ncta
     */
    public String getNcta() {
        return ncta;
    }

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

    /**
     * @return the numofic
     */
    public String getNumofic() {
        return numofic;
    }

    /**
     * @param numofic the numofic to set
     */
    public void setNumofic(String numofic) {
        this.numofic = numofic;
    }
    public String calcularcta(String d){
        int n=Integer.valueOf(d)+1;
        String m=String.valueOf(n);
        while(m.length()!=10)m="0"+m;
        return m;
    }

    public void altaproducto(String titular, String dni, String tipo, String Ncta){
        String uProducto;
        Producto p = null;
        if(tipo.equalsIgnoreCase("CuentaCorriente")){
             p=new CCorriente();
        }
        else if(tipo.equalsIgnoreCase("LibretaAhorro"))
        {
             p=new Libreta();
        }
        else if(tipo.equalsIgnoreCase("PrestamoPersonal")){
             p=new PrstmPersonal();
        }
        else if(tipo.equalsIgnoreCase("PrestamoHipotecario")){
             p=new PrstmHipotecario();
        }

        p.setNumeroProducto(Ncta);
        uProducto=this.calcularcta(ncta);
        this.setNcta(uProducto);

        if(this.buscarCliente(dni)==null){
             ClienteFisico c;
             c=new ClienteFisico();
             c.setNombreCliente(titular);
             c.setDocumentacion(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.buscarCliente(dni);
            c.insertaProductoenCliente(p);
            p.insertaTitularenProducto(c);
        }




        mProducto.add(p);

    }


public void transferencia(String c1, String c2, Double imp){
       Producto p,p1=new Producto();
       p=this.devuelveProducto(c1);
       p1=this.devuelveProducto(c2);
       Date fec= new Date();
       if((imp>=1) && (p.getSaldo()-imp>=0) && (p!=null)){
                 OpTransferencia op=new OpTransferencia();
                 OpTransferencia op2=new OpTransferencia();
                 op.setId(Movimiento.idsc++);
                 op.setConceptobreve("Transferencia bancaria");
                 op.setFechaOperacion(fec);
                 op.setImporte(-imp);
                 p.addOpTransferencia(op);
             if(p1!=null){

                 op2.setId(Movimiento.idsc++);
                 op2.setConceptobreve("Transferencia bancaria");
                 op2.setFechaOperacion(fec);
                 op2.setImporte(imp);
                 p1.addOpTransferencia(op2);

                         }
             else{
                 Double comision=(imp*0.1)/100;
                 op2.setId(Movimiento.idsc++);
                 op2.setConceptobreve("Comisión por transferencia.");
                 op2.setImporte(-comision);
                 op2.setFechaOperacion(fec);
                 p.addOpTransferencia(op2);
                 }
             }
}

    /**
     * @return the mCaja
     */
    public ArrayList<Caja> getMCaja() {
        return mCaja;
    }

    /**
     * @param mCaja the mCaja to set
     */
    public void setMCaja(ArrayList<Caja> mCaja) {
        this.mCaja = mCaja;
    }


    public Caja buscarCaja(String s) {
        Iterator it = this.mCaja.listIterator();
        while (it.hasNext()) {
            Caja ca = (Caja)it.next();
            if (ca.getCodcaja().compareToIgnoreCase(s) == 0) {
                return ca;
            }
        }
        return null;
    }

    public Empleado buscarEmpleado(String s) {
        Iterator it = this.getMEmpleado().listIterator();
        while (it.hasNext()) {
            Empleado e = (Empleado)it.next();
            if (e.getcodEmpleado().compareToIgnoreCase(s) == 0) {
                return e;
            }
        }
        return null;
    }

    /**
     * @return the mEmpleado
     */
    public ArrayList<Empleado> getMEmpleado() {
        return mEmpleado;
    }

    /**
     * @param mEmpleado the mEmpleado to set
     */
    public void setMEmpleado(ArrayList<Empleado> mEmpleado) {
        this.mEmpleado = mEmpleado;
    }

    void altaCliente(String dni, String nombre) {
        Cliente c=new Cliente();
        c.setDocumentacion(dni);
        c.setNombreCliente(nombre);
        this.mCliente.add(c);
    }

    /**
     * @return the director
     */
    public Director getDirector() {
        return director;
    }

    /**
     * @param director the director to set
     */
    public void setDirector(Director director) {
        this.director = director;
    }

    public Caja cajacentral(Caja CCentral){
          Iterator it = this.getMCaja().listIterator();
        while (it.hasNext()) {
            Caja c = (Caja)it.next();
            if (c.getCodcaja().compareToIgnoreCase("CJ0000") == 0) {
                it.remove();
                this.getMCaja().add(this.Ccentral);
            }
        }
        return null;
                             }
    
    public void modificarSaldoCaja(Caja c, Double imp,int tipo){//tipo 0 Caja->CCentral
        Date d= new Date();                                     //tipo 1 CCentral->Caja
        OpBasica op=new OpBasica();
        op.setConceptobreve("Dinero en caja");
        op.setFechaOperacion(d);
        OpBasica op2=new OpBasica();
        op2.setConceptobreve("Dinero en caja");
        op2.setFechaOperacion(d);
        if(tipo==0 && c.getSaldo()-imp>=0 ){
           op.setImporte(imp);
           op.setId(id);
           this.id=this.id+1;
           this.getCcentral().addOpBasica(op);
           op2.setImporte(-imp);
           op2.setId(id);
           c.addOpBasica(op2);
           this.id=this.id+1;
           this.cajacentral(this.Ccentral);
                 }
        else if(tipo==1 && this.getCcentral().getSaldo()-imp>=0){
           op.setImporte(-imp);
           op.setId(id);
           this.id=this.id+1;
           this.getCcentral().addOpBasica(op);
           op2.setImporte(imp);
           op2.setId(id);
           c.addOpBasica(op2);
           this.id=this.id+1;
           this.cajacentral(this.Ccentral);
                      }
                                     }

    /**
     * @return the Ccentral
     */
    public Caja getCcentral() {
        return Ccentral;
    }

    /**
     * @param Ccentral the Ccentral to set
     */
    public void setCcentral(Caja Ccentral) {
        this.Ccentral = Ccentral;
    }

}






