/*
 * Copyright (c) 1997-2001 Centro de Informática - UFPE
 */

/**
 * Esta classe modela um banco, com suas contas e as operações sobre elas.
 */
public class Banco {

    // O número de contas atualmente cadastradas.
    private int indice;

    // 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 cadastrar(Conta c) {
        if (indice < MAX_CONTAS) { // Ainda pode ser cadastrada ?
            contas[indice] = c;
            indice = indice + 1;
        } else {
            System.out.println ("Esta agencia está cheia. Conta não cadastrada.");
        }
    }

    /**
     * Procura uma conta neste banco, dada o número da conta procurada.
     */
    private Conta procurar(long numero) {
        int i = 0; // Variáveis locais ao método.
        boolean achou = false;
        Conta retorno;

        while ((!achou) & (i < indice)) {
            if (contas[i].getNumero() == numero)
                achou = true;
            else
                i = i + 1;
        }

        if (achou == true)
            retorno = contas[i];
        else
            retorno = null;

        return retorno; // 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 printSaldo(long numero) {
        Conta c;

        c = procurar(numero);
        if (c == null)
            System.out.println("A conta " + numero + " nao existe!");
        else
            c.printSaldo();
    }

    /**
     * Debita o valor especificado na conta dada.
     */
    public void debitar(long numero, double valor) {
        Conta c;

        c = this.procurar(numero);
        if (c == null)
            System.out.println("A conta " + numero + " nao existe!");
        else
            c.debitar(valor);
    }

    /**
     * Credita o valor especificado na conta dada.
     */
    public void creditar(long numero, double valor) {
        Conta c;

        c = this.procurar(numero);
        if (c == null)
            System.out.println("A conta " + numero + " nao existe!");
        else
            c.creditar(valor);
    }

    /**
     * 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 transferir(long numeroDe, long numeroPara, double valor) {
        Conta contaDe, contaPara;

        contaDe = this.procurar(numeroDe);
        contaPara = this.procurar(numeroPara);
        if ((contaDe == null) || (contaPara == null))
            System.out.println("Um das contas não existe!");
        else {
            contaDe.debitar(valor);
            contaPara.creditar(valor);
        }
    }

    /**
     * Retorna a soma dos saldos de todas as contas do banco.
     */
    public double getSaldoTotal() {
        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 getNumeroClientes() {
        return indice;
    }

    /**
     * M&eacute;todo para testes.
     */
    public static void main(String args[]) {
        Banco b = new Banco();
        b.cadastrar(new Conta(1312, 20.00));
        b.cadastrar(new Conta(43125));
        b.cadastrar(new Conta(4723,100.0));
        b.printSaldo(1312);
        b.creditar(1312, 98.98);
        b.printSaldo(1312);
        System.out.println("O banco tem R$"+b.getSaldoTotal()+" em depositos");
        b.debitar(12, 10.00);  // Esta linha dará um erro.
        System.out.println ("O banco tem "+b.getNumeroClientes()+" clientes.");
    }

}