//Construtores
 public Accoutnsdatabase(string nr_de_conta, string bi_pessoa, ContaOrdem contaordem)
 {
     this.nr_conta = nr_de_conta;
     this.bi = bi_pessoa;
     this.conta = contaordem;
     this.tipo = 1;
 }
        //***********************************************************************            Programa principal           ********************************************************************************************************************************
        static void Main()
        {
            #region Variáveis do programa principal
            //Variáveis necessárias para o funcionamento do software
            int operacao, prazo, juros;
            int contador,contador2,contadorat;
            double valor_inicial_conta_prazo, dinheiro_a_transferir;
            string tipo_conta, bi_a_pesquisar, bi_a_comparar, nr_a_pesquisar, nr_a_comparar, nr__conta_a_retirar, nr__conta_a_depositar;    //variáveis para guardar na arraylist e pesquisar
            Pessoa pessoa_a_adicionar;  //Variável do tipo Pessoa da classe que se criou para guardar na conta a ser criada

            //Variáveis temporárias para a criação das contas
            ContaOrdem contaordemcriada;                        //Objecto Temporário
            ContaPrazo contaprazocriada;                        //Objecto Temporário
            ArrayList database = new ArrayList();               //Guarda todas as contas na arraylist

            #endregion

            #region Algumas pessoas e contas criadas para efeitos de teste do programa
            //algumas pessoas e contas declaradas manualmente para efeitos de teste
            Pessoa teste1 = new Pessoa("Paulo Carvalho", "87654321", "Palheira, Estrada Principal", "19-06-1986", "915555557", "*****@*****.**");
            Pessoa teste2 = new Pessoa("Helena Sofia", "12345678", "Coimbra, Barcouço, Rua Fonte nova", "04-10-1991", "915995557", "*****@*****.**");
            ContaOrdem contateste1 = new ContaOrdem(teste1);
            database.Add(contateste1);
            ContaPrazo contateste2 = new ContaPrazo(teste2, 5, 1,500.12);
            database.Add(contateste2);
            ContaPrazo contateste3 = new ContaPrazo(teste1, 2, 1,735.50);
            database.Add(contateste3);
            ContaOrdem contateste4 = new ContaOrdem(teste1);
            database.Add(contateste4);
            ContaPrazo contateste5 = new ContaPrazo(teste2, 1, 2,2000);
            database.Add(contateste5);
            #endregion

            //Mensagem de boas vindas
            Console.ForegroundColor = ConsoleColor.DarkGreen;
            Console.WriteLine("Bem vindo ao programa de gestão do BANCO -NOME DO BANCO-\n\n");
            Console.ResetColor();

            //Programa principal - Operações do menu();
            operacao =menu();
            do
            {
                #region Option 1: Criar uma nova conta bancária
                if (operacao == 1)
                {
                    //criar a pessoa que vai ser o proprietário da conta
                    pessoa_a_adicionar = criar_pessoa();

                    Console.ForegroundColor = ConsoleColor.DarkCyan;
                    Console.WriteLine ("Qual o tipo de conta?\n\n1- Conta Ordem\n2- Conta Prazo");
                    Console.ResetColor();
                    tipo_conta=Console.ReadLine();

                    //definir o tipo de conta
                    if (tipo_conta=="1")
                    {
                        contaordemcriada= new ContaOrdem(pessoa_a_adicionar);
                        database.Add(contaordemcriada);
                    }
                    //se o tipo de conta for do tipo conta a Prazo é necessário questionar informações relativas aos juros e duração da conta a prazo
                    else if (tipo_conta=="2")
                    {
                        Console.ForegroundColor = ConsoleColor.DarkCyan;
                        Console.WriteLine("Qual a duração do prazo da conta? Unidade: ano(s)");
                        Console.ResetColor();
                        prazo = Convert.ToInt32(Console.ReadLine());
                        Console.ForegroundColor = ConsoleColor.DarkCyan;
                        Console.WriteLine("Qual o valor da taxa de juros? Unidade: percentagem (Valor inteiro)");
                        Console.ResetColor();
                        juros = Convert.ToInt32(Console.ReadLine());
                        Console.ForegroundColor = ConsoleColor.DarkCyan;
                        Console.WriteLine("Qual o valor que deseja meter a prazo em euro(s)");
                        Console.ResetColor();
                        valor_inicial_conta_prazo = Convert.ToDouble(Console.ReadLine());

                        contaprazocriada= new ContaPrazo(pessoa_a_adicionar,juros,prazo,valor_inicial_conta_prazo);
                        database.Add(contaprazocriada);
                    }
                    operacao = menu();
                }
                #endregion
                #region Option 2: Pesquisar uma conta por número de bilhete de identidade
                else if (operacao == 2)
                {
                    Console.Clear();
                    Console.ForegroundColor = ConsoleColor.DarkCyan;
                    Console.WriteLine("Qual o nr de BI da pessoa a qual se associa a conta?\n\n");
                    Console.ResetColor();
                    bi_a_pesquisar = Console.ReadLine();

                    //contador para sabermos quantas contas foram encontradas
                    contador = 0;
                    foreach (Conta conta in database)
                    {
                        bi_a_comparar = conta.dar_bi_da_pessoa();

                        if (bi_a_pesquisar == bi_a_comparar)
                        {
                            contador++;
                            conta.mostrar_info();
                        }
                    }

                    if (contador == 0)
                    {
                        Console.ForegroundColor = ConsoleColor.Red;
                        Console.WriteLine("\nNão foi encontrada nenhuma conta através do número de BI que inseriu.");
                        Console.ResetColor();
                    }
                    else
                    {
                        Console.ForegroundColor = ConsoleColor.DarkYellow;
                        Console.WriteLine("Número total de contas: {0}", contador);
                        Console.ResetColor();
                    }

                    operacao = menu();
                }
                #endregion
                #region Option 3: Pesquisar uma conta por número de conta
                else if (operacao == 3)
                {
                    Console.Clear();
                    Console.ForegroundColor = ConsoleColor.DarkCyan;
                    Console.WriteLine("Qual o nr de conta?\n\n");
                    Console.ResetColor();
                    nr_a_pesquisar = Console.ReadLine();

                    contador = 0;

                    foreach (Conta conta in database)
                    {
                        nr_a_comparar = conta.dar_nr_conta();

                        if (nr_a_pesquisar == nr_a_comparar)
                        {
                            contador++;
                            conta.mostrar_info();
                            break;
                        }
                    }

                    if (contador == 0)
                    {
                        Console.ForegroundColor = ConsoleColor.Red;
                        Console.WriteLine("\nNão foi encontrada nenhuma conta através do número de conta que inseriu.");
                        Console.ResetColor();
                    }

                    operacao = menu();
                }
                #endregion
                #region Option 4: Eliminar uma conta
                else if (operacao == 4)
                {
                    Console.Clear();
                    Console.ForegroundColor = ConsoleColor.DarkCyan;
                    Console.WriteLine("Qual o nr de conta que deseja eliminar?\n\n");
                    Console.ResetColor();
                    nr_a_pesquisar = Console.ReadLine();

                    contador = 0;

                    //contador necessário para saber a posição da conta na arraylist assim que encontrada
                    contadorat = 0;
                    foreach (Conta conta in database)
                    {

                        nr_a_comparar = conta.dar_nr_conta();

                        if (nr_a_pesquisar == nr_a_comparar)
                        {
                            contador++;
                            Console.ForegroundColor = ConsoleColor.Red;
                            Console.WriteLine("A seguinte conta foi apagada:\n\n");
                            Console.ResetColor();
                            conta.mostrar_info();
                            //remover a conta da arraylist
                            database.RemoveAt(contadorat);
                            break;
                        }
                        contadorat++;
                    }

                    if (contador == 0)
                    {
                        Console.ForegroundColor = ConsoleColor.Red;
                        Console.WriteLine("\nNão foi encontrada nenhuma conta através do número de conta que inseriu.");
                        Console.ResetColor();
                    }

                    operacao = menu();
                }
                #endregion
                #region Option 5: Depositar dinheiro numa conta
                else if (operacao == 5)
                {
                    Console.Clear();
                    Console.ForegroundColor = ConsoleColor.DarkCyan;
                    Console.WriteLine("Qual o nr de conta em que deseja depositar dinheiro?\n\n");
                    Console.ResetColor();
                    nr_a_pesquisar = Console.ReadLine();

                    contador = 0;
                    foreach (Conta conta in database)
                    {

                        nr_a_comparar = conta.dar_nr_conta();

                        if (nr_a_pesquisar == nr_a_comparar)
                        {
                            contador++;
                            Console.ForegroundColor = ConsoleColor.DarkYellow;
                            Console.WriteLine("Depositar dinheiro na seguinte conta:\n\n");
                            Console.ResetColor();
                            conta.mostrar_info();
                            conta.depositar_dinheiro();
                            break;
                        }
                    }

                    if (contador == 0)
                    {
                        Console.ForegroundColor = ConsoleColor.Red;
                        Console.WriteLine("\nNão foi encontrada nenhuma conta através do número de conta que inseriu.");
                        Console.ResetColor();
                    }

                    operacao = menu();
                }
                #endregion
                #region Option 6: Levantar dinheiro de uma conta
                else if (operacao == 6)
                {
                    Console.Clear();
                    Console.ForegroundColor = ConsoleColor.DarkCyan;
                    Console.WriteLine("Qual o nr de conta em que deseja levantar dinheiro?\n\n");
                    Console.ResetColor();
                    nr_a_pesquisar = Console.ReadLine();

                    contador = 0;
                    foreach (Conta conta in database)
                    {

                        nr_a_comparar = conta.dar_nr_conta();

                        if (nr_a_pesquisar == nr_a_comparar)
                        {
                            contador++;
                            Console.ForegroundColor = ConsoleColor.DarkYellow;
                            Console.WriteLine("\nDepositar dinheiro na seguinte conta:\n\n\n");
                            Console.ResetColor();
                            conta.mostrar_info();
                            conta.levantar_dinheiro();
                            break;
                        }
                    }

                    if (contador == 0)
                    {
                        Console.ForegroundColor = ConsoleColor.Red;
                        Console.WriteLine("\nNão foi encontrada nenhuma conta através do número de conta que inseriu.");
                        Console.ResetColor();
                    }

                    operacao = menu();
                }
                #endregion
                #region Option 7: Listar todos os movimentos de uma conta
                else if (operacao == 7)
                {
                    Console.Clear();
                    Console.ForegroundColor = ConsoleColor.DarkCyan;
                    Console.WriteLine("Qual o nr de conta da qual deseja listar movimentos?\n\n");
                    Console.ResetColor();
                    nr_a_pesquisar = Console.ReadLine();

                    contador = 0;
                    foreach (Conta conta in database)
                    {

                        nr_a_comparar = conta.dar_nr_conta();

                        if (nr_a_pesquisar == nr_a_comparar)
                        {
                            contador++;
                            Console.ForegroundColor = ConsoleColor.DarkYellow;
                            Console.WriteLine("\nMovimentos da seguinte conta:\n\n\n");
                            Console.ResetColor();
                            conta.mostrar_info();
                            conta.listar_movimentos();
                            break;
                        }
                    }

                    if (contador == 0)
                    {
                        Console.ForegroundColor = ConsoleColor.Red;
                        Console.WriteLine("\nNão foi encontrada nenhuma conta através do número de conta que inseriu.");
                        Console.ResetColor();
                    }

                    operacao = menu();
                }
                #endregion
                #region Option 8: Transferir dinheiro entre duas contas
                else if (operacao == 8)
                {
                    Console.Clear();
                    Console.ForegroundColor = ConsoleColor.DarkCyan;
                    Console.WriteLine("Insira o nº de conta remetente:\n\n");
                    Console.ResetColor();
                    nr__conta_a_retirar = Console.ReadLine();
                    Console.ForegroundColor = ConsoleColor.DarkCyan;
                    Console.WriteLine("Insira o nº de conta destinatário:\n\n");
                    Console.ResetColor();
                    nr__conta_a_depositar = Console.ReadLine();

                    //verificar se a conta destino existe para o dinheiro não ir para o ar.
                    contador = 0;
                    contador2 = 0;
                    foreach (Conta conta in database)
                    {

                        nr_a_comparar = conta.dar_nr_conta();

                        if (nr__conta_a_depositar == nr_a_comparar)
                        {
                            contador++;
                        }
                        if (nr__conta_a_retirar == nr_a_comparar)
                        {
                            contador2++;
                        }
                    }

                    if (contador2 > 0)
                    {

                        //se a conta de destino existir então continua com a transferência
                        if (contador > 0)
                        {
                            foreach (Conta conta in database)
                            {

                                nr_a_comparar = conta.dar_nr_conta();

                                if (nr__conta_a_retirar == nr_a_comparar)
                                {
                                    dinheiro_a_transferir = conta.transferir_dinheiro();
                                    efectuar_transf(dinheiro_a_transferir, nr__conta_a_depositar, database);
                                    break;
                                }
                            }
                        }
                        else
                        {
                            Console.ForegroundColor = ConsoleColor.Red;
                            Console.WriteLine("\nOperação cancelada!\n\nNão existe nenhuma conta destino com o número que selecionou");
                            Console.ResetColor();
                        }
                    }
                    else
                    {
                        Console.ForegroundColor = ConsoleColor.Red;
                        Console.WriteLine("\nOperação cancelada!\n\nNão existe nenhuma conta de remetente com o número que inseriu");
                        Console.ResetColor();
                    }
                    operacao = menu();
                }
                #endregion
                #region Option 9: Listar todas as contas bancárias
                else if (operacao == 9)
                {
                    Console.ForegroundColor = ConsoleColor.DarkYellow;
                    Console.WriteLine("Todas as contas da base de dados:\n\n");
                    Console.ResetColor();

                    //contador para sabermos quantas contas foram encontradas
                    contador = 0;
                    foreach (Conta conta in database)
                    {
                            contador++;
                            conta.mostrar_info();
                    }

                    if (contador == 0)
                    {
                        Console.ForegroundColor = ConsoleColor.Red;
                        Console.WriteLine("\nNão foi encontrada nenhuma conta através do número de BI que inseriu.");
                        Console.ResetColor();
                    }
                    else {
                        Console.ForegroundColor = ConsoleColor.DarkYellow;
                        Console.WriteLine("\nForam encontradas {0} contas bancárias.",contador);
                        Console.ResetColor();
                        }
                    operacao = menu();
                }
                #endregion
            } while (operacao != 10);
        }