/*
 * Copyright (c) 1997-2000 Departamento de Informática - UFPE
 */

/**
 * Esta classe modela um banco, com suas contas e as operações sobre elas.
 */
class Banco {

    /**
     * O número de contas atualmente cadastradas.
     */
    private int indice = 0;

    /**
     * As contas cadastradas neste banco.
     */
    private Conta[] contas;

    /**
     * O número máximo de contas que podem ser cadastradas neste banco.
     */
    private final int MAX_CONTAS = 50;

    /**
     * Cria um novo banco.
     */
    public Banco () {
        contas = new Conta[MAX_CONTAS];
        indice = 0;
    }

    /**
     * Cadastra uma conta no banco. Avisa se não pode efetuar o cadastro.
     */
    public void cadastro(Conta c) {
        if (indice < MAX_CONTAS) { // Ainda pode ser cadastrada ?
            contas[indice] = c;
            indice = indice + 1;
        } 
        else {
            throw new ArrayIndexOutOfBoundsException
                      ("Esta agencia está cheia. Conta não cadastrada.");
        }
    }

    /**
     * Procura uma conta neste banco, dada o número da conta procurada.
     */
    private Conta procurar(String num) { 
        int i = 0; // Variáveis locais ao método.
        boolean achou = false;
        Conta result;

        while ((! achou) & (i < indice)) {
            if (contas[i].getNumero().equals(num))
                achou = true;
            else
                i = i + 1;
        }

        if (achou == true)
            result = contas[i];
        else
            result = null;

        return result;    // return tem que ser a ultima instrucao!
    }

    /**
     * Imprime os saldos da conta especificada.
     *
     * @param num   O número da conta que se deseja imprimir o saldo.
     */
    public void imprimirSaldo(String num) {
        Conta c;

        c = procurar(num);
        if (c != null) {
            c.imprimirSaldo();
        }    
        else {
            throw new IllegalArgumentException 
                    ("A conta " + num + " nao existe!");
        }              
            
    }

    /**
     * Debita o valor especificado na conta dada.
     */
    public void debitar(String num, double val) {
        Conta c;

        c = this.procurar(num); 
        if (c  != null) {
            c.debitar(val);    
        }    
        else {
            throw new IllegalArgumentException
                      ("A conta " + num + " nao existe!");
        }    
            
    }

    /**
     * Credita o valor especificado na conta dada.
     */
    public void creditar(String num, double val) {
        Conta c;

        c = this.procurar(num); 
        if (c != null) 
        {
            c.creditar(val);    
            
        }    
        else {
            throw new IllegalArgumentException("A conta " + num +
                                               " nao existe!");
        }    
            
    }

    /**
     * Transfere um valor especificado entre duas contas.
     *
     * @param numDe   O número da conta a ser debitada.
     * @param numPara O número da conta a ser creditada.
     * @param val     O valor a ser transferido.
     */
    public void transfere(String numDe, String numPara, double val) {
        Conta contaDe, contaPara;

        contaDe = this.procurar(numDe);
        contaPara = this.procurar(numPara); 
        if ((contaDe != null) && (contaPara != null)) {
            contaDe.debitar(val);
            contaPara.creditar(val);        
        }    
        else {
            throw new IllegalArgumentException ("Um das contas não existe!");
        }
    }

    /**
     * Retorna a soma dos saldos de todas as contas do banco.
     */
    public double saldoTotal() {
        int i;
        double total;

        total = 0.0;
        for (i = 0; i < indice; i = i + 1)
            total = total + contas[i].getSaldo();

        return total;
    }

    /**
     * Retorna o número de clientes do banco.
     */
    public int numClientes() {
        return indice;
    }

    /**
     * M&eacute;todo para testes.
     */
    public static void main(String args[]) {
        Banco b = new Banco();
        b.cadastro(new Conta("1312", 20.00));
        b.cadastro(new Conta("43125"));
        b.cadastro(new Conta("4723",100.0));
        b.imprimirSaldo("4723");
        b.creditar("1312", 98.98);
        b.imprimirSaldo("1312");
        System.out.println("O banco tem R$"+b.saldoTotal()+" em depositos");
        b.debitar("12", 10.00);  // Esta linha dará um erro.
        System.out.println ("O banco tem "+b.numClientes()+" clientes.");
    }
}

