package daial;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.math.BigInteger;
import java.text.DecimalFormat;
import java.text.NumberFormat;
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.F968F54D-53C5-D985-CE47-70E4A5AAA5A4]
// </editor-fold> 
public class Sucursal {

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.A0DD8847-4C31-548A-9128-97E2E9C31693]
    // </editor-fold> 
    private ArrayList<Producto> mProducto;
    private ArrayList<Remesa> mRemesa;
    private ArrayList<Empleado> mEmpleado;
    private ArrayList<Caja> mCajas;


    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.426D1BE8-B70F-2767-F1AC-7456660FA262]
    // </editor-fold> 
    public Sucursal () {
        mProducto = new ArrayList();
        mRemesa = new ArrayList();
        mEmpleado = new ArrayList();
        mCajas = new ArrayList();
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,regenBody=yes,id=DCE.9613C587-1797-BAC3-ED38-991DA6F475AC]
    // </editor-fold> 
    public ArrayList<Producto> getProducto () {
        return mProducto;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,regenBody=yes,id=DCE.65120113-7E5C-16BB-7365-E8490B8AC14C]
    // </editor-fold> 
    public void setProducto (ArrayList<Producto> val) {
        mProducto = val;
    }

    public void insertarProducto(Producto p){
        mProducto.add(p);
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,regenBody=yes,id=DCE.4868E4C4-673E-FE99-F506-7C1A31B0B0F5]
    // </editor-fold> 
    public ArrayList<Remesa> getRemesa () {
        return mRemesa;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,regenBody=yes,id=DCE.D2334F00-16CC-1492-C311-16062C070D97]
    // </editor-fold> 
    public void setRemesa (ArrayList<Remesa> val) {
        this.mRemesa = val;
    }

    // <editor-fold defaultstate="collapsed" desc=" UML Marker "> 
    // #[regen=yes,id=DCE.1B064F4D-453C-3895-E4FC-5FC606607E42]
    // </editor-fold> 
    public String verRemesaCargos (String path) {
        String linea;
        String ordenante, titular, importe, total, textoResumen="";
        try {
            FileReader fr = null;
            fr = new FileReader(path);
            BufferedReader bf = new BufferedReader(fr);

            while ((linea = bf.readLine()) != null) {
                String buf = linea.substring(0, 4);
                if(buf.compareTo("5180")==0){
                    ordenante = linea.substring(28, 68);
                    textoResumen+=ordenante;
                } else if(buf.compareTo("5680")==0){
                    titular=linea.substring(28, 68);
                    importe=linea.substring(88, 98);
                    textoResumen += "\n" + titular + "\t" + importe;
                } else if(buf.compareTo("5980")==0){
                    total=linea.substring(88, 98);
                    textoResumen += "\n" + "Total remesa: " + total;
                }
            }
        } catch (IOException ex) {
            Logger.getLogger(Sucursal.class.getName()).log(Level.SEVERE, null, ex);
        }
        return textoResumen;
    }

    public String verRemesaAbonos (String path) {//FALTA TERMINAR PERO NECESITO FICHERO EJEMPLO DE REMESA DE ABONOS
        String linea;
        String ordenante, titular, importe, total, textoResumen="";
        try {
            FileReader fr = null;
            fr = new FileReader(path);
            BufferedReader bf = new BufferedReader(fr);

            while ((linea = bf.readLine()) != null) {
                String buf = linea.substring(0, 4);
                if(buf.compareTo("0356")==0){
                    ordenante = linea.substring(28, 68);
                    textoResumen+=ordenante;
                } else if(buf.compareTo("5680")==0){
                    titular=linea.substring(28, 68);
                    importe=linea.substring(88, 98);
                    textoResumen += "\n" + titular + "\t" + importe;
                } else if(buf.compareTo("5980")==0){
                    total=linea.substring(88, 98);
                    textoResumen += "\n" + "Total remesa: " + total;
                }
            }
        } catch (IOException ex) {
            Logger.getLogger(Sucursal.class.getName()).log(Level.SEVERE, null, ex);
        }
        return textoResumen;
    }

    public void incorporarRemesaCargos (String path) throws ParseException {//FALTA TERMINAR PERO NECESITO FICHERO EJEMPLO DE REMESA DE ABONOS
        //OBTENER EL NUMERO DE CUENTA DE TELEFONICA DEL FICHERO
        Remesa r = new Remesa();

        String numCtaOrdenante="",totalAOrdenante="0";

        try {
            String linea, concepto, fecha="", numCta, importe, ordenante="";
            FileReader fr = null;
            fr = new FileReader(path);
            BufferedReader bf = new BufferedReader(fr);
            while ((linea = bf.readLine()) != null) {
                String buf = linea.substring(0, 4);
                if (buf.compareTo("5380") == 0) {
                    fecha = linea.substring(22, 28);
                    ordenante = linea.substring(28, 68);
                    numCtaOrdenante = linea.substring(68, 88);
                }else if(buf.compareTo("5680")==0){
                    OPRemesa op = new OPRemesa();
                    numCta = linea.substring(68, 88);
                    importe = linea.substring(88, 98);
                    concepto = linea.substring(114, 154);
                    op.setConcepto(concepto);

                    SimpleDateFormat df1 = new SimpleDateFormat("ddMMyy");
                    op.setFechaOperacion(df1.parse(fecha));

                    DecimalFormat df2 = new DecimalFormat("#######,##");
                    Number n = df2.parse(importe);
                    op.setImporte(n.floatValue());
                    r.insertarMovimientoenRemesa(op);
                    Producto p;
                    p=this.devuelveProducto(numCta);

                    if(!p.buscarDomiciliacion(ordenante))
                    {
                        p.insertarDomiciliacion(ordenante);
                    }
                    
                    p.insertarMovimientoProducto(op);
                    double saldofinal = p.getSaldo()-n.floatValue();
                    saldofinal = Math.rint(saldofinal*100)/100;//REDONDEA EN 2 CIFRAS DECIMALES
                    p.setSaldo(saldofinal);
                    //modificarSaldo(numCta,n.floatValue()); //Va quitando el saldo correspondiente

                }else if(buf.compareTo("5980")==0){
                    totalAOrdenante = linea.substring(88, 98);
                }
            }
            DecimalFormat df2 = new DecimalFormat("#######,##");
            Number n = df2.parse(totalAOrdenante);
            
            Producto p;
            p=this.devuelveProducto(numCtaOrdenante);

            double saldofinal = p.getSaldo()+n.floatValue();
            saldofinal = Math.rint(saldofinal*100)/100;//REDONDEA EN 2 CIFRAS DECIMALES
            p.setSaldo(saldofinal);
            //modificarSaldo(numCtaOrdenante,-(n.floatValue()));//Suma el total a la cuenta de la empresa ordenante

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

    public void incorporarRemesaAbonos (String path) throws ParseException {
        //OBTENER EL NUMERO DE CUENTA DE TELEFONICA DEL FICHERO
        Remesa r = new Remesa();

        String numCtaOrdenante="",totalAOrdenante="0";

        try {
            String linea, concepto, fecha="", numCta, importe, ordenante;
            FileReader fr = null;
            fr = new FileReader(path);
            BufferedReader bf = new BufferedReader(fr);
            while ((linea = bf.readLine()) != null) {
                String buf = linea.substring(0, 4);
                if (buf.compareTo("5380") == 0) {
                    fecha = linea.substring(22, 28);
                    ordenante = linea.substring(28, 40);
                    numCtaOrdenante = linea.substring(68, 88);
                }else if(buf.compareTo("5680")==0){
                    OPRemesa op = new OPRemesa();
                    numCta = linea.substring(68, 88);
                    importe = linea.substring(88, 98);
                    concepto = linea.substring(114, 154);
                    op.setConcepto(concepto);

                    SimpleDateFormat df1 = new SimpleDateFormat("ddMMyy");
                    op.setFechaOperacion(df1.parse(fecha));

                    DecimalFormat df2 = new DecimalFormat("#######,##");
                    Number n = df2.parse(importe);
                    op.setImporte(n.floatValue());
                    r.insertarMovimientoenRemesa(op);
                    Producto p;
                    p=this.devuelveProducto(numCta);
                    p.insertarMovimientoProducto(op);

                    p.setSaldo(p.getSaldo()-(n.floatValue()));//modificarSaldo(numCta,); //Va quitando el saldo correspondiente

                }else if(buf.compareTo("5980")==0){
                    totalAOrdenante = linea.substring(88, 98);
                }
            }
            DecimalFormat df2 = new DecimalFormat("#######,##");
            Number n = df2.parse(totalAOrdenante);

            Producto p;
            p=this.devuelveProducto(numCtaOrdenante);
            p.setSaldo(p.getSaldo()+n.floatValue());//modificarSaldo(numCtaOrdenante,n.floatValue());//Suma el total a la cuenta de la empresa ordenante

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

    public void insertarRemesaaSucursal(Remesa r){
        this.mRemesa.add(r);
    }

//    private void modificarSaldo(String numCta,double cantidad){
//        double saldofinal;
//        Iterator i = this.mProducto.listIterator();
//        while(i.hasNext()){
//            Producto p = (Producto) i.next();
//            if(p.getNumeroProducto().compareTo(numCta)==0){
//                saldofinal = p.getSaldo() + cantidad;
//                saldofinal = Math.rint(saldofinal*100)/100;//REDONDEA EN 2 CIFRAS DECIMALES
//                p.setSaldo(saldofinal);
//            }
//        }
//    }

    private Producto devuelveProducto(String numCta){
        Iterator i = this.mProducto.listIterator();
        while(i.hasNext()){
            Producto p = (Producto) i.next();
            if(p.getNumeroProducto().compareTo(numCta)==0){
                return p;
            }
        }
        return null;
    }

    public Producto buscarCuenta(String patronBusqueda){
       Iterator<Producto> it=mProducto.iterator();
       while (it.hasNext()) {
           Producto praux = (Producto) it.next();
           if(patronBusqueda.compareTo(praux.getNumeroProducto())==0 || patronBusqueda.compareTo(praux.getNombreCliente())==0){
                return praux;
           }
       }
       return null;
    }

    public String sigNumeroCuentaMax(String DC){
        int num = 1000000000;
        int numsig;
        int numCuenta;
        boolean encontrado = false;
        Iterator<Producto> it=mProducto.iterator();
        while (!encontrado){
            while (it.hasNext() && !encontrado) {
                Producto praux = (Producto) it.next();
                if (DC.compareTo(praux.getNumeroProducto().substring(8, 10))==0){
                    numCuenta = Integer.valueOf(praux.getNumeroProducto().substring(10));
                    if(numCuenta == num){
                        encontrado = true;
                    }
                }
            }
            if (encontrado){
                num++;
                encontrado = false;
            }
            else encontrado = true;
        }
        return "20984002" + DC + String.valueOf(num);
    }
    
    public ArrayList<Producto> buscarCuentas(String patronBusqueda){
       Iterator<Producto> it=mProducto.iterator();

       ArrayList<Producto> cuentas = new ArrayList();

       while (it.hasNext()) {
           Producto praux = (Producto) it.next();
           if(patronBusqueda.compareTo(praux.getNumeroProducto())==0 || patronBusqueda.compareTo(praux.getNombreCliente())==0){
                cuentas.add(praux);
           }
       }
       return cuentas;
    }
    /**
     * @return the mEmpleado
     */
    public ArrayList<Empleado> getMEmpleado() {
        return mEmpleado;
    }

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

    /**
     * @return the mCajas
     */
    public ArrayList<Caja> getMCajas() {
        return mCajas;
    }

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

    public void insertarCaja(Caja c){
        mCajas.add(c);
    }

    public void insertarEmpleado(Empleado e){
        mEmpleado.add(e);
    }

    public Empleado buscarEmpleado(String e, String pass)
    {
        boolean encontrado = false;
        int i = 0;

        while(!encontrado && i<mEmpleado.size())
        {
            if(e.equals(mEmpleado.get(i).getUsuario()) && pass.equals(mEmpleado.get(i).getPassword()))
            {
                encontrado = true;
                return mEmpleado.get(i);

            }else
                i++;
        }

        return null;
    }

}

