// Bankas_Sistema_PD_MG_14_06_2025_b2
// Visas darbibas ir aprakstisi dokumenta - Bankas_Sistema_Nosacijumi_MG_14_06_2025_lv.txt (Originalam nav _lv beiga)
using System;
using System.Collections.Generic;

class BankasKonts
{
    public string KontaNumurs { get; private set; }
    public string KontaVards { get; private set; }
    public decimal Atlikums { get; private set; }
    public bool Aktivs { get; private set; }

    private static Random rnd = new Random();
    private static HashSet<string> usedNumbers = new HashSet<string>();

    public BankasKonts(string vards)
    {
        do
        {
            KontaNumurs = GenerateAccountNumber();
        } while (usedNumbers.Contains(KontaNumurs));
        
        usedNumbers.Add(KontaNumurs);
        KontaVards = vards;
        Atlikums = 0;
        Aktivs = true;
    }

    // Destruktors — registre, kad objekts tiek iznicinats
    ~BankasKonts()
    {
        Console.WriteLine($"[DESTRUKTORS] Konta objekts ar numuru {KontaNumurs} tika iznicinats.");
    }

    private string GenerateAccountNumber()
    {
        string num = "";
        for (int i = 0; i < 10; i++)
            num += rnd.Next(0, 10).ToString();
        return num;
    }

    public void Iemaksat(decimal summa)
    {
        Atlikums += summa;
    }

    public void Iznemt(decimal summa)
    {
        if (summa > Atlikums)
            throw new InvalidOperationException("Nepietiek naudas!");
        Atlikums -= summa;
    }

    public void ParaditInformaciju()
    {
        Console.WriteLine($"Numurs: {KontaNumurs}");
        Console.WriteLine($"Vards: {KontaVards}");
        Console.WriteLine($"Atlikums: {Atlikums}");
        Console.WriteLine($"Statuss: {(Aktivs ? "Aktivs" : "Neaktivs")}");
    }

    public void Deaktivet()
    {
        Aktivs = false;
    }
}

class Program
{
    static List<BankasKonts> konti = new List<BankasKonts>();
    static string[] vardi = { "Anna", "Janis", "Ilze", "Peteris", "Liga", "Andris" };

    static void Main()
    {
        while (true)
        {
            Console.WriteLine("1. Izveidot jaunu kontu");
            Console.WriteLine("2. Noguldit naudu");
            Console.WriteLine("3. Iznemt naudu");
            Console.WriteLine("4. Paradit informaciju");
            Console.WriteLine("5. Dzest kontu");
            Console.WriteLine("6. Iziet");
            Console.Write("\nIzveleties darbibu: ");

            string choice = Console.ReadLine();

            switch (choice)
            {
                case "1":
                    IzveidotKontu();
                    break;
                case "2":
                    NaudaDarbiba(true);
                    break;
                case "3":
                    NaudaDarbiba(false);
                    break;
                case "4":
                    ParaditInfo();
                    break;
                case "5":
                    DzestKontu();
                    break;
                case "6":
                    return;
                default:
                    Console.WriteLine("Nederiga izvele!");
                    break;
            }
        }
    }

    static void IzveidotKontu()
    {
        string vards = vardi[new Random().Next(vardi.Length)];
        var konts = new BankasKonts(vards);
        konti.Add(konts);
        Console.WriteLine($"Izveidots konts ar numuru {konts.KontaNumurs} un ipasnieku {konts.KontaVards}");
    }

    static BankasKonts AtrastKontu(string numurs)
    {
        return konti.Find(k => k.KontaNumurs == numurs && k.Aktivs);
    }

    static void NaudaDarbiba(bool iemaksat)
    {
        Console.Write("Ievadiet konta numuru: ");
        string numurs = Console.ReadLine();
        var konts = AtrastKontu(numurs);
        if (konts == null)
        {
            Console.WriteLine("Konts nav atrasts.");
            return;
        }

        Console.Write("Ievadiet summu: ");
        if (!decimal.TryParse(Console.ReadLine(), out decimal summa) || summa <= 0)
        {
            Console.WriteLine("Nederiga summa.");
            return;
        }

        try
        {
            if (iemaksat)
                konts.Iemaksat(summa);
            else
                konts.Iznemt(summa);
            Console.WriteLine("Darbiba veikta veiksmigi.");
        }
        catch (Exception ex)
        {
            Console.WriteLine("Kluda: " + ex.Message);
        }
    }

    static void ParaditInfo()
    {
        Console.Write("Ievadiet konta numuru: ");
        string numurs = Console.ReadLine();
        var konts = AtrastKontu(numurs);
        if (konts == null)
        {
            Console.WriteLine("Konts nav atrasts.");
            return;
        }

        konts.ParaditInformaciju();
    }

    static void DzestKontu()
    {
        Console.Write("Ievadiet konta numuru: ");
        string numurs = Console.ReadLine();
        var konts = AtrastKontu(numurs);
        if (konts == null)
        {
            Console.WriteLine("Konts nav atrasts.");
            return;
        }

        Console.Write("Vai tiesam velaties dzest kontu? (y/n): ");
        if (Console.ReadLine().ToLower() == "y")
        {
            konts.Deaktivet();
            Console.WriteLine("Konts tika dzests (atspejots).");
        }
    }
}
