using System;
using System.Collections.Generic;

public class BankasKonts
{
    private string kontaNumurs;
    private string ipasniekaVards;
    private decimal atlikums;
    
    // Unikālo kontu numuru ģenerēšanai
    private static int nextKontaNumurs = 1;
    private static HashSet<string> visiKontaNumuri = new HashSet<string>();
    
    // Īpašības ar get piekļuvi
    public string KontaNumurs { get => kontaNumurs; }
    public string IpasniekaVards { get => ipasniekaVards; }
    public decimal Atlikums { get => atlikums; }
    
    public BankasKonts(string ipasniekaVards, decimal sākumaAtlikums = 0)
    {
        this.ipasniekaVards = ipasniekaVards;
        this.atlikums = sākumaAtlikums;
        
        // Ģenerē unikālu konta numuru
        this.kontaNumurs = GeneretKontaNumuru();
        visiKontaNumuri.Add(this.kontaNumurs);
        
        Console.WriteLine($"\nKonts izveidots ar numuru: {this.kontaNumurs}");
    }
    
    ~BankasKonts()
    {
        Console.WriteLine($"\nKonts ar numuru {kontaNumurs} tiek iznicinats.");
        visiKontaNumuri.Remove(this.kontaNumurs);
    }
    
    // Mtode konta numura ģenerēšanai
    private string GeneretKontaNumuru()
    {
        string numurs;
        do
        {
            numurs = "FF" + nextKontaNumurs.ToString("D5");
            nextKontaNumurs++;
        } while (visiKontaNumuri.Contains(numurs));
        
        return numurs;
    }
    
    // Naudas noguldīšana
    public void Noguldit(decimal summa)
    {
        if (summa <= 0)
        {
            throw new ArgumentException("Noguldamai summai jabut lielakai par 0");
        }
        
        atlikums += summa;
        Console.WriteLine($"\nKonta {kontaNumurs} noguldits {summa:C}. Jauns atlikums: {atlikums:C}");
    }
    
    // Naudas izņemšana
    public void Izņemt(decimal summa)
    {
        if (summa <= 0)
        {
            throw new ArgumentException("Iznemamai summai jabut lielakai par 0");
        }
        
        if (summa > atlikums)
        {
            throw new InvalidOperationException("Konta nav pietiekami daudz naudas");
        }
        
        atlikums -= summa;
        Console.WriteLine($"\nNo konta {kontaNumurs} iznemts {summa:C}. Jauns atlikums: {atlikums:C}");
    }
    
    // Konta informācija
    public void ParadiInformaciju()
    {
        Console.WriteLine("\n=== Konta informacija ===");
        Console.WriteLine($"Konta numurs: {kontaNumurs}");
        Console.WriteLine($"ipasnieka vards: {ipasniekaVards}");
        Console.WriteLine($"Atlikums: {atlikums:C}");
    }
}

class Program
{
    static List<BankasKonts> konti = new List<BankasKonts>();
    
    static void Main(string[] args)
    {
        bool darbojas = true;
        
        while (darbojas)
        {
            try
            {
                Console.WriteLine("Ludzu, izvelieties darbibu:");
                Console.WriteLine("\n1. Izveidot jaunu bankas kontu");
                Console.WriteLine("2. Noguldit naudu konta");
                Console.WriteLine("3. Iznemt naudu no konta");
                Console.WriteLine("4. Paradit konta informaciju");
                Console.WriteLine("5. Dzest kontu");
                Console.WriteLine("6. Iziet no sistemas");
                Console.Write("\nJusu izvele: ");
                
                string ievade = Console.ReadLine();
                
                if (!int.TryParse(ievade, out int izvele))
                {
                    Console.WriteLine("\nKluda: Ievadiet derigu skaitli");
                    continue;
                }
                
                switch (izvele)
                {
                    case 1:
                        IzveidotKontu();
                        break;
                    case 2:
                        VeiktOperaciju("noguldit");
                        break;
                    case 3:
                        VeiktOperaciju("iznemt");
                        break;
                    case 4:
                        ParadiKontaInformaciju();
                        break;
                    case 5:
                        DzestKontu();
                        break;
                    case 6:
                        darbojas = false;
                        Console.WriteLine("\nProgramma tiek slegta");
                        break;
                    default:
                        Console.WriteLine("\nKluda: Nepareiza izvele. Meginiet velreiz.");
                        break;
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine($"\nKluda: {ex.Message}");
            }
        }
    }
    
    static void IzveidotKontu()
    {
        Console.Write("\nIevadiet konta ipasnieka vardu: ");
        string vards = Console.ReadLine();
        
        if (string.IsNullOrWhiteSpace(vards))
        {
            throw new ArgumentException("Vardam jabut noraditam");
        }
        
        Console.Write("Ievadiet atlikumu: ");
        string ievade = Console.ReadLine();
        
        decimal atlikums = 0;
        if (!string.IsNullOrWhiteSpace(ievade) && !decimal.TryParse(ievade, out atlikums))
        {
            throw new ArgumentException("Nepareizs atlikuma formats");
        }
        
        BankasKonts jaunsKonts = new BankasKonts(vards, atlikums);
        konti.Add(jaunsKonts);
    }
    
    static void VeiktOperaciju(string operacija)
    {
        BankasKonts konts = AtrastKontu();
        if (konts == null) return;
        
        Console.Write($"\nIevadiet summu, ko velaties {operacija}: ");
        string ievade = Console.ReadLine();
        
        if (!decimal.TryParse(ievade, out decimal summa))
        {
            throw new ArgumentException("Nepareiza summas formats");
        }
        
        if (operacija == "noguldit")
        {
            konts.Noguldit(summa);
        }
        else
        {
            konts.Izņemt(summa);
        }
    }
    
    static void ParadiKontaInformaciju()
    {
        BankasKonts konts = AtrastKontu();
        if (konts == null) return;
        
        konts.ParadiInformaciju();
    }
    
    static void DzestKontu()
    {
        BankasKonts konts = AtrastKontu();
        if (konts == null) return;
        
        Console.WriteLine($"\nVai tiesam velaties dzest kontu ar numuru {konts.KontaNumurs}? (j/n)");
        string atbilde = Console.ReadLine().ToLower();
        
        if (atbilde == "j")
        {
            konti.Remove(konts);
            Console.WriteLine($"\nKonts {konts.KontaNumurs} dzests");
        }
        else
        {
            Console.WriteLine("\nKonta dzesana atcelta");
        }
    }
    
    static BankasKonts AtrastKontu()
    {
        if (konti.Count == 0)
        {
            Console.WriteLine("\nNav pieejamu kontu. Izveidojiet kontu");
            return null;
        }
        
        Console.WriteLine("\nPieejamie konti:");
        for (int i = 0; i < konti.Count; i++)
        {
            Console.WriteLine($"{i + 1}. {konti[i].KontaNumurs} - {konti[i].IpasniekaVards}");
        }
        
        Console.Write("\nIevadiet konta numuru vai indeksu: ");
        string ievade = Console.ReadLine();
        
        // Atrast pēc indeksa
        if (int.TryParse(ievade, out int indekss) && indekss > 0 && indekss <= konti.Count)
        {
            return konti[indekss - 1];
        }
        
        // Atrast pēc konta numura
        foreach (var konts in konti)
        {
            if (konts.KontaNumurs.Equals(ievade, StringComparison.OrdinalIgnoreCase))
            {
                return konts;
            }
        }
        
        throw new ArgumentException("Konts ar numuru/indeksu netika atrasts");
    }
}