using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using CLCarte;

namespace AppConsoleGestioneCarte
{
    class GestioneApplicazione
    {
        ArchivioCarte archivioCarte;
        
        public GestioneApplicazione()
        {
            archivioCarte = new ArchivioCarte();
            this.GestioneMenu();
        }




        private void GestioneMenu()
        {
            char tasto;

            for (; ; )
            {
                do
                {

                    tasto = StampaMenu();

                } while (tasto != 'I' && tasto != 'S' && tasto != 'E' && tasto != 'A' && tasto != 'T' && tasto != 'R');

                switch (tasto)
                {
                    case 'I':
                        GestioneInserimento();
                        break;

                    case 'S':
                        GestioneStampa();
                        break;

                    case 'T':
                        GestioneTransazioni();
                        break;

                    case 'R':
                        GestioneRicariche();
                        break;

                    case 'A':
                        GestioneAnalisi();
                        break;

                    case 'E':
                        UscitaDalProgramma();
                        break;
                }

            }
        }


        private void UscitaDalProgramma()
        {
            Environment.Exit(0);
        }


        private char StampaMenu()
        {
            char tasto = ' ';
            bool ElementoInseritoValido;

            do
            {
                ElementoInseritoValido = true;

                Console.Clear();

                Console.WriteLine("I)nserimento carte");
                Console.WriteLine("S)tampa carte");
                Console.WriteLine("T)ransazione con le carte");
                Console.WriteLine("R)icarica carte prepagate");
                Console.WriteLine("A)nalisi dei dati");
                Console.WriteLine("E)sci del programma");
                Console.Write("\nInserire la scelta desiderata (I,S,T,R,A,E)->");

                try
                {
                    tasto = Convert.ToChar(Console.ReadLine());
                }
                catch (Exception)
                {
                    Console.WriteLine("Attenzione! Non hai inserito un carattere.");
                    ElementoInseritoValido = false;
                    Console.ReadLine();
                }

            } while (ElementoInseritoValido == false);

            tasto = Char.ToUpper(tasto);

            return tasto;
        }


        private void GestioneAnalisi()
        {
            Console.WriteLine("Scegliere la tipologia di analisi da effettuare:");
            Console.WriteLine("1 - per contare il n° di carte di diverso tipo");

            int scelta = Convert.ToInt32(Console.ReadLine());

            switch (scelta)
            {
                case 1:
                    int numeroCPrepagate, numeroCDebito, numeroCCredito;
                    ContaCarte(out numeroCPrepagate, out numeroCDebito, out numeroCCredito);
                    Console.WriteLine("Sono state inserite " + numeroCPrepagate + " carte prepagate, " + numeroCDebito + " carte di debito e " + numeroCCredito + " carte di credito");
                    break;
                
                default:
                    Console.WriteLine("Errore nella scelta");
                    break;
            }

            Console.ReadLine();

        }



        private void ContaCarte(out int nCPrepagate, out int nCDebito, out int nCCredito)
        {
            nCPrepagate = 0;
            nCDebito = 0;
            nCCredito = 0;

            foreach (Carta carta in archivioCarte)
            {
                if (carta is CartaPrepagata)
                {
                    nCPrepagate++;
                }
                else
                {
                    if (carta is CartaDebito)
                    {
                        nCDebito++;
                    }
                    else
                    {
                        nCCredito++;
                    }
                }
            }

        }



        private void GestioneRicariche()
        {
            Console.Write("Inserire il numero della carte che si vuole ricaricare: ");
            int numeroCarta = Convert.ToInt32(Console.ReadLine());

            Carta cartaDaGestire = new Carta();

            cartaDaGestire = archivioCarte.RicercaCartaPerNumero(numeroCarta);

            if (cartaDaGestire != null)
            {
                if (cartaDaGestire is CartaPrepagata)
                {
                    Console.Write("Inserire l'importo della ricarica: ");
                    double importoRicarica = Convert.ToDouble(Console.ReadLine());

                    ((CartaPrepagata)cartaDaGestire).Ricarica(importoRicarica);

                    Console.WriteLine("Ricarica effettuata");
                }
                else
                {
                    Console.WriteLine("Non si possono ricaricare carte non prepagate");
                }
            }
            else
            {
                Console.WriteLine("Carta inesistente");
            }

            

            Console.ReadLine();

        }



        private void GestioneTransazioni()
        {
            Console.Write("Inserire il numero della carte tramite la quale si vuol gestire una transazione: ");
            int numeroCarta = Convert.ToInt32(Console.ReadLine());

            Carta cartaDaGestire = new Carta();

            cartaDaGestire = archivioCarte.RicercaCartaPerNumero(numeroCarta);

            if (cartaDaGestire != null)
            {
                Transazione(cartaDaGestire);
            }
            else
            {
                Console.WriteLine("Carta inesistente");
            }

            Console.ReadLine();

        }


        private void Transazione(Carta c)
        {
            Console.Write("Inserire l'importo della transazione: ");
            double importoTransazione = Convert.ToDouble(Console.ReadLine());

            try
            {
                c.Transazione(importoTransazione);
                Console.WriteLine("Transazione effettuata con successo");
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message.ToString());
            }
            
        }


        private void GestioneInserimento()
        {
            Carta cartaDaInserire;
            
            Console.WriteLine("\nScegliere cosa si vuol inserire ...\n");

            Console.WriteLine("Digitare:");
            Console.WriteLine("1 - per inserire una carta prepagata");
            Console.WriteLine("2 - per inserire una carta debito");
            Console.WriteLine("3 - per inserire una carta credito");

            int scelta = Convert.ToInt32(Console.ReadLine());

            switch (scelta)
            {
                
                case 1:
                    cartaDaInserire = InizializzazioneDatiMembroCartaPrepagata();

                    try
                    {
                        archivioCarte.Add(cartaDaInserire);
                        Console.WriteLine("Inserimento effettuato");
                    }
                    catch (Exception)
                    {
                        Console.WriteLine("Numero della carta già presente");
                    }

                    break;

                case 2:
                    cartaDaInserire = InizializzazioneDatiMembroCartaDebito();

                    try
                    {
                        archivioCarte.Add(cartaDaInserire);
                        Console.WriteLine("Inserimento effettuato");
                    }
                    catch (Exception)
                    {
                        Console.WriteLine("Numero della carta già presente");
                    }

                    break;

                case 3:
                    cartaDaInserire = InizializzazioneDatiMembroCartaCredito();

                    try
                    {
                        archivioCarte.Add(cartaDaInserire);
                        Console.WriteLine("Inserimento effettuato");
                    }
                    catch (Exception)
                    {
                        Console.WriteLine("Numero della carta già presente");
                    }

                    break;
                
                default:
                    Console.WriteLine("Inserito un carattere non valido");
                    break;
            }

            Console.ReadLine();

        }


        private Carta InizializzazioneDatiMembroCarta()
        {
            Console.Write("Inserire il nome dell'intestatario: ");
            string nome = Console.ReadLine();

            Console.Write("Inserire il cognome dell'intestatario: ");
            string cognome = Console.ReadLine();

            Console.Write("Inserire il numero della carta: ");
            int numeroCarta = Convert.ToInt32(Console.ReadLine());

            Console.Write("Inserire il pin della carta: ");
            int pinCarta = Convert.ToInt32(Console.ReadLine());

            Console.Write("Inserire il plafond della carta: ");
            double plafondCarta = Convert.ToDouble(Console.ReadLine());

            Console.Write("Inserire il costo di attivazione della carta: ");
            double costoAttivazioneCarta = Convert.ToDouble(Console.ReadLine());

            Carta c = new Carta(nome, cognome, numeroCarta, pinCarta, plafondCarta, costoAttivazioneCarta, 0, 0);

            return c;

        }

        private CartaPrepagata InizializzazioneDatiMembroCartaPrepagata()
        {
            Carta c = InizializzazioneDatiMembroCarta();

            CartaPrepagata cp = new CartaPrepagata(c.NomeIntestatario, c.CognomeIntestatario, c.Numero, c.Pin, c.Plafond, c.CostoApertura, c.NumeroOperazioniMensili, c.TotaleSpeseMeseCorrente, 0);

            return cp;
        }

        private CartaDebito InizializzazioneDatiMembroCartaDebito()
        {
            Carta c = InizializzazioneDatiMembroCarta();

            Console.Write("Inserire il conto corrente collegato alla carta: ");
            int ccCarta = Convert.ToInt32(Console.ReadLine());

            Console.Write("Inserire il limite di spesa mensile della carta: ");
            double limiteSpesa = Convert.ToDouble(Console.ReadLine());

            CartaDebito cd = new CartaDebito(c.NomeIntestatario, c.CognomeIntestatario, c.Numero, c.Pin, c.Plafond, c.CostoApertura, c.NumeroOperazioniMensili, c.TotaleSpeseMeseCorrente, ccCarta, limiteSpesa);

            return cd;
        }

        private CartaCredito InizializzazioneDatiMembroCartaCredito()
        {
            Carta c = InizializzazioneDatiMembroCarta();

            Console.Write("Inserire il conto corrente collegato alla carta: ");
            int ccCarta = Convert.ToInt32(Console.ReadLine());

            Console.Write("Inserire il giorno di addebito sul c/c (numero da 1 a 30): ");
            int giornoAddebito = Convert.ToInt32(Console.ReadLine());

            List<string> listaAccessori = new List<string>();

            string risposta = "";
            do
            {
                Console.Write("Inserire un servizio accessorio per la carta: ");
                string servizio = Console.ReadLine();

                listaAccessori.Add(servizio);

                Console.Write("Hai finito? (Rispondere S o N): ");
                risposta = Console.ReadLine().ToUpper();

            } while (risposta == "N");

            CartaCredito cc = new CartaCredito(c.NomeIntestatario, c.CognomeIntestatario, c.Numero, c.Pin, c.Plafond, c.CostoApertura, c.NumeroOperazioniMensili, c.TotaleSpeseMeseCorrente, ccCarta, listaAccessori, giornoAddebito);

            return cc;

        }



        private void GestioneStampa()
        {
            foreach (Carta carta in archivioCarte)
            {
                Console.WriteLine(carta.ToString());
                Console.WriteLine("**********************************************************");
            }
            Console.ReadLine();
        }


    }
}
