/*
         * public static void ExecutarCalculadora(){
         *
         *  //Console.WriteLine(Calculadora.Sum(new int[] { 1, 4, 5, 10})); sem usar  a palavra params no parametro do método Sum na classe Calculadora
         *  Console.WriteLine(Calculadora.Sum( 1, 4, 5, 10 )); // utilizando a palavra params no parametro do método Sum na classe Calculadora
         *
         *  // Console.WriteLine(Calculadora.Sum(new double[] { 2.5, 4.5, 13.4 })); sem usar  a palavra params no parametro do método Sum na classe Calculadora
         *  Console.WriteLine(Calculadora.Sum( 2.5, 4.5, 13.4 ));
         *  //Console.WriteLine(Calculadora.Sum(new String[] { "Claudio", "Fatima", "Zuila", "Bibiu" }));
         *  Console.WriteLine(Calculadora.Sum("Claudio", "Fatima", "Zuila", "Bibiu" ));
         *
         *  int x = 10;
         *
         *  Calculadora.Triple(ref x); // informando no parametro com a palavra ref a variavel que será referenciada
         *
         *  Console.WriteLine(x);
         *
         *  int valor = 10;
         *  int result; // com o modificador out não é obrigatorio iniciar a variavel resul
         *
         *  Calculadora.Triple(valor, out result);
         *
         *  Console.WriteLine(result);
         *
         *
         * }
         */

        public static void UpcastingDowcasting(Produto pn, Produto pi)
        {
            // DOWCASTING

            /* ProdutoNacional pn2 = pn; nesse caso ocorre um erro pois o compilador não sabe que a variavel pn
             * do tipo Produto faz referencia a um  objeto do tipo ProdutoNacional sendo necessario casting. */
            // fazendo dowcasting
            ProdutoNacional pn2 = (ProdutoNacional)pn;

            ExibirProduto(pn2);

            ProdutoImportado pi2 = (ProdutoImportado)pi;

            ExibirProduto(pi2);

            /*É necessario muito cuidado ao fazer DOWCASTING pois devemos verificar o tipo do objeto ao qual a variavel faz referencia.
             * Caso contrario pode ocorrer erro. ex:*/

            /* ProdutoImportado pn3 = (ProdutoImportado)pn;  erro pois nesse caso a variavel pn não faz referencia a um objeto do tipo ProdutoImportado
             * e sim a um objeto do tipo ProdutoNacional. Nesse caso é necessario fazer uma verificação confome o exemplo a seguir : */

            //verificando o tipo do objeto à qual a variavel faz referencia com a palavra (is)

            if (pn is ProdutoImportado)
            {
                ProdutoImportado pi3 = (ProdutoImportado)pn;
            }
            else
            {
                Console.WriteLine(" Erro, a variavel pn do tipo Produto não faz referencia a um objeto do tipo ProdutoImportado ");
            }

            if (pi is ProdutoNacional)
            {
                ProdutoNacional pn3 = (ProdutoNacional)pi;
            }
            else
            {
                Console.WriteLine(" Erro, a variavel pi do tipo Produto não faz referencia a um objeto do tipo ProdutoNacional ");
            }



            if (pn is ProdutoNacional)
            {
                // forma opcional de fazer o casting(neste caso dowcasting) utilizando a palavra (as)
                // ProdutoNacional pn4 = (ProdutoNacional)pn;
                ProdutoNacional pn4 = pn as ProdutoNacional;
                ExibirProduto(pn4);
            }
            else
            {
                Console.WriteLine(" Erro, a variavel pn do tipo Produto não faz referencia a um objeto do tipo ProdutoNacional ");
            }

            if (pi is ProdutoImportado)
            {
                //ProdutoImportado pi4 = (ProdutoImportado)pi;
                ProdutoImportado pi4 = pi as ProdutoImportado;
                ExibirProduto(pi4);
                // MostrarProduto(pi4);
            }
            else
            {
                Console.WriteLine(" Erro, a variavel pi do tipo Produto não faz referencia a um objeto do tipo ProdutoImportado ");
            }
        }
        public static void CadastrarProduto(Produto produto, Produto[] produtos, int pos)
        {
            Console.WriteLine(" Cadastrar Produto (1- Nacional) ou (2- Importado) (3- Importado Chines)\n");
            int opcao = int.Parse(Console.ReadLine());

            Console.WriteLine(" Entre com os dados do Produto \n");

            Console.WriteLine(" Entre com o preço do produto :");
            decimal preco = decimal.Parse(Console.ReadLine(), CultureInfo.InvariantCulture);

            // p.SetPreco(Double.Parse(Console.ReadLine(), CultureInfo.InvariantCulture));

            Console.WriteLine(" Entre com a quantidade do estoque do produto :");
            int qtdEstoque = int.Parse(Console.ReadLine());

            //p.SetQtdEmEstoque(int.Parse(Console.ReadLine()));

            if (opcao == 1)
            {
                Console.WriteLine(" Entre com o valor da taxa de imposto(%) do produto nacional :");
                decimal impostoNacional = decimal.Parse(Console.ReadLine());
                //string.Format("{0:00.00}", impostoNacional);
                produto = new ProdutoNacional(preco, qtdEstoque, impostoNacional);
            }
            else
            {
                if (opcao == 2)
                {
                    Console.WriteLine(" Entre com o valor da taxa de imposto(%) do produto importado :");
                    decimal impostoImportado = decimal.Parse(Console.ReadLine());

                    // String.Format("{0:00.00}", impostoImportado);

                    produto = new ProdutoImportado(preco, qtdEstoque, impostoImportado);
                }
                else
                {
                    Console.WriteLine(" Entre com o valor da taxa de imposto(%) do produto importado Chines :");
                    decimal impostoImportadoChines = decimal.Parse(Console.ReadLine());

                    // String.Format("{0:00.00}", impostoImportado);

                    produto = new ProdutoImportadoChines(preco, qtdEstoque, impostoImportadoChines);
                }
            }

            Console.WriteLine(" Entre com o nome do produto :");
            produto.Nome = Console.ReadLine();


            if (pos < produtos.Length)
            {
                produtos[pos] = produto;
            }
            else
            {
                throw new IndexOutOfRangeException(" Operação invalida ! Tentativa de adicionar quantidade de produtos superior à capacidade de estoque. \n");
            }


            //MostrarProduto(p);
            ExibirProduto(produto);
            //AdicionarProduto(p);
            // RemoverProduto(p);
        }