 using System; // pievieno pamata funkcijas
using System.Collections.Generic; // pievieno List atbalstu
using System.IO; // pievieno failu operācijas

enum Kategorija { Mape, Datne } // definē mapi vai datni

class Vienums // pārstāv gan mapes, gan datnes
{
    public string Vards { get; set; } // tur vienuma nosaukumu
    public Vienums Parent { get; set; } // atsauce uz augstāko līmeni
    public List<Vienums> Sub { get; } = new List<Vienums>(); // saraksts ar iekšējiem vienumiem
    public Kategorija Type { get; set; } // vai tas ir mape vai datne

    public Vienums(string v, Kategorija t, Vienums p = null) // konstruktorā uzstāda laukus
    { Vards = v; Type = t; Parent = p; } // iestatīju nosaukumu, tipu un vecāku

    public void Show() // izvada pašreizējā vienuma saturu
    { if (Type == Kategorija.Datne) { Console.WriteLine($"[F] {Vards}"); } // ja datne, atzīmē F
      else { Console.WriteLine($"[D] {Vards}"); foreach (var c in Sub) Console.WriteLine($" -{c.Vards}({c.Type})"); } } // ja mape, parāda bērnus

    public bool Exist(string n) => Sub.Exists(x => x.Vards == n); // pārbauda, vai eksistē bērns ar šo vārdu

    public Vienums Find(string n) => Sub.Find(x => x.Vards == n); // atrod bērnu pēc nosaukuma

    public void Insert(Vienums v) // pievieno jaunu vienumu
    { if (!Exist(v.Vards)) Sub.Add(v); else Console.WriteLine("Ir jau."); } // ja vēl nav, pievieno, citādi ziņo

    public void Delete(string n) // dzēš iekšējo vienumu
    { var e = Find(n); if (e == null) { Console.WriteLine("Neatrasts."); return; } // ja nav tāda, izejam
      if (e.Type == Kategorija.Mape && e.Sub.Count > 0) { Console.Write($"Dzēst {n}? y/n: "); if (Console.ReadLine() != "y") return; } // prasa apstiprinājumu, ja mape nav tukša
      if (e.Type == Kategorija.Datne && File.Exists(e.Vards)) File.Delete(e.Vards); // dzēš failu diskā
      Sub.Remove(e); Console.WriteLine($"Noņemts {n}"); } // izņem no saraksta un ziņo
}

class FSConductor // galvenā vadības klase
{
    Vienums Root = new Vienums("C:", Kategorija.Mape); // failu sistēmas sakne
    Vienums Curr; // pašreizējā atrašanās vieta

    public FSConductor() { Curr = Root; } // konstruktors uzstāda Curr uz sakni

    public void Run() // interaktīvā cikla sākums
    { while (true) // mūžīgā cilpa
      { Console.Write($"{GetPath(Curr)}> "); var inp = Console.ReadLine(); if (string.IsNullOrWhiteSpace(inp)) continue; // gaida komandu
        var parts = inp.Split(new[] { ' ' }, 2); var cmd = parts[0]; var arg = parts.Length > 1 ? parts[1] : ""; // sadala komandu un parametru

        if (cmd == "ls") Curr.Show(); // uzskaita saturu
        else if (cmd == "cd") ChangeDir(arg); // maina mapi
        else if (cmd == "addfile") Make(arg, Kategorija.Datne); // izveido failu
        else if (cmd == "addmap") Make(arg, Kategorija.Mape); // izveido mapi
        else if (cmd == "rmmape") Curr.Delete(arg); // dzēš mapi
        else if (cmd == "rmfile") DeleteFile(arg); // dzēš failu
        else if (cmd == "skatit") ReadFile(arg); // rāda faila saturu
        else if (cmd == "palidziba") PrintHelp(); // rāda palīdzību
        else if (cmd == "iziet") break; // pārtrauc darbu
        else Console.WriteLine("Kļūda! raksti palidziba."); // nepazīstama komanda
      } }

    void Make(string n, Kategorija t) // izveido mapi vai datni
    { if (Curr.Exist(n)) { Console.WriteLine("Ir jau."); return; } // ja eksistē, atceļ
      var v = new Vienums(n, t, Curr); Curr.Insert(v); if (t == Kategorija.Datne) File.WriteAllText(n, ""); } // ja datne, ieraksta tukšu failu

    void DeleteFile(string n) // dzēš datni
    { var e = Curr.Find(n); if (e != null && e.Type == Kategorija.Datne) { if (File.Exists(n)) File.Delete(n); Curr.Sub.Remove(e); Console.WriteLine($"Dzēsts {n}"); } else Console.WriteLine("Nepieciešamā datne nav."); } // ziņo, ja nav

    void ChangeDir(string d) // maina pašreizējo mapi
    { if (d == "..") { if (Curr.Parent != null) Curr = Curr.Parent; else Console.WriteLine("Saknē esam."); } // vienu uz augšu
      else if (d == "/") Curr = Root; // pilnīgs ceļš uz sakni
      else { var e = Curr.Find(d); if (e != null && e.Type == Kategorija.Mape) Curr = e; else Console.WriteLine("Mape nav."); } } // ieiet iekšējā mapi

    void ReadFile(string n) // izvada faila saturu
    { var e = Curr.Find(n); if (e == null || e.Type != Kategorija.Datne) { Console.WriteLine("Nav faila."); return; } // pārbauda, vai ir datne
      if (File.Exists(n)) Console.WriteLine(File.ReadAllText(n)); else Console.WriteLine("[tukšs]"); } // rāda saturu vai tukšumu

    void PrintHelp() // izvada komandu sarakstu citā secībā
    { Console.WriteLine("Komandas:"); Console.WriteLine("skatit    Rāda faila saturu"); Console.WriteLine("rmmape    Dzēš mapi"); Console.WriteLine("rmfile    Dzēš failu"); Console.WriteLine("cd        Maina mapi"); Console.WriteLine("addfile   Izveido datni"); Console.WriteLine("addmap    Izveido mapi"); Console.WriteLine("ls        Parāda saturu"); Console.WriteLine("palidziba Rāda šo palīdzību"); Console.WriteLine("iziet     Beidz darbu"); } // sakārtots citā kārtībā

    string GetPath(Vienums v) // ģenerē tekstu ceļam
    { var stack = new List<string>(); for (var x = v; x != null; x = x.Parent) stack.Insert(0, x.Vards); return string.Join("\\", stack); } // savieno līmeņus ar '\'
}

class Program // palaiž visu sistēmu
{ static void Main() { new FSConductor().Run(); } } // sāk interaktīvo darbību
