public void SaveTafels(TafelArray tafels)
        {
            var JSONoptions = new JsonSerializerOptions
            {
                WriteIndented = true,
            };

            File.WriteAllText("Tafels.json", JsonSerializer.Serialize(tafels, JSONoptions));
        }
 public void removeReservering(Reservering reservering, TafelArray tafels)
 {
     reservering.RemoveTafels(tafels, true);
     Reservering[] newReserveringen = new Reservering[this.Reserveringen.Length - 1];
     for (int i = 0, j = 0; i < this.Reserveringen.Length; i++)
     {
         if (this.Reserveringen[i] != reservering)
         {
             newReserveringen[j++] = this.Reserveringen[i];
         }
     }
     this.Reserveringen = newReserveringen;
 }
        public ReserveerLijst BekijkReserveringenMedewerker(TafelArray tafels)
        {
            if (Reserveringen == null)
            {
                Reserveringen = new Reservering[0];
            }
            if (Reserveringen.Length == 0)
            {
                Console.Clear();
                Console.WriteLine(ASCIIART.ReserveringenArt());
                Console.WriteLine("Er zijn nog geen reserveringen gemaakt\x0a\x0a" + "Klik op een toets om terug te gaan");
                Console.ReadKey();
                return(this);
            }
            while (true)
            {
                Console.Clear();
                Console.WriteLine(ASCIIART.ReserveringenArt());
                Console.WriteLine("Voor welke datum wilt u de reserveringen bekijken? (21 juni)\n\nEnter: Ga terug naar het vorige scherm");
                string datum = Console.ReadLine();
                datum.ToLower();
                Console.Clear();
                if (datum == "")
                {
                    return(this);
                }

                datum = CheckDatum.checkDatum(datum);
                int AantalRelevanteReserveringen = BerekenRelevanteReserveringen(datum);
                if (AantalRelevanteReserveringen <= 0)
                {
                    Console.Clear();
                    Console.WriteLine(ASCIIART.ReserveringenArt());
                    Console.WriteLine("Er zijn nog geen reserveringen gedaan voor deze datum of de datum is ongeldig. Klik op een toets om terug te gaan.\x0a");
                    Console.ReadKey();
                }
                else
                {
                    Reservering[] RelevanteReserveringen = new Reservering[AantalRelevanteReserveringen];
                    int           j = 0;
                    foreach (Reservering reservering in Reserveringen)
                    {
                        if (reservering.Datum == datum)
                        {
                            RelevanteReserveringen[j++] = reservering;
                        }
                    }
                    BekijkSpecifiekePaginaMedewerker(RelevanteReserveringen, tafels, datum);
                }
            }
        }
        public void BekijkSpecifiekeReserveringMedewerker(Reservering reservering, TafelArray tafels) //Laat een specifieke reservering zien, met de opties om tafels toe te voegen of te verwijderen, als dit mogelijk is.
        {
            bool wrongInput = false;

            while (true)
            {
                Console.Clear();
                reservering.Info();
                bool heeftTafelsNodig = reservering.HeeftTafelsNodig();
                bool heeftTafels      = reservering.HeeftTafels();
                if (heeftTafelsNodig)
                {
                    Console.WriteLine("\nA: Tafels koppelen");
                }
                if (heeftTafels)
                {
                    Console.WriteLine("\nB: Tafels ontkoppelen");
                }
                Console.WriteLine("0: Terug");
                if (wrongInput)
                {
                    Console.WriteLine("Verkeerde Input!");
                }
                char userInput = Console.ReadKey().KeyChar;
                if (userInput == '0')
                {
                    return;
                }
                else if (userInput == 'A' && heeftTafelsNodig)
                {
                    reservering.AddTafels(tafels);
                }
                else if (userInput == 'B' && heeftTafels)
                {
                    reservering.RemoveTafels(tafels);
                }
                else
                {
                    wrongInput = true;
                }
            }
        }
        public void AddTafels(TafelArray tafels)
        {
            bool wrongInput = false;

            while (true)
            {
                Console.Clear();
                Console.WriteLine(ASCIIART.TafelsArt());
                Console.WriteLine("Koppel Tafels aan de reservering\n");
                Console.WriteLine("1: Bekijk alle vrije tafels\n");
                Console.WriteLine("2: Koppel tafels via ID\n");
                Console.WriteLine("3: Automatisch koppelen\n");
                Console.WriteLine("0: Terug\n");
                if (wrongInput)
                {
                    Console.WriteLine("Wrong input! Probeer 1, 2, 3 of 0");
                }
                char userInput = Console.ReadKey().KeyChar;
                switch (userInput)
                {
                case '1':
                    tafels.BekijkVrijeTafels($"{this.Tijd}{this.Datum}");
                    break;

                case '2':
                    this.Tafels = tafels.KoppelenDoorMedewerker(this.Personen, this.Tafels, $"{this.Tijd}{this.Datum}");     //Personen -> aantal personen, Tafels -> gereserveerde tafels die al gekoppeld zijn.
                    break;

                case '3':
                    this.Tafels = tafels.AutomatischKoppelen(this.Personen, this.Tafels, $"{this.Tijd}{this.Datum}");     //Personen -> aantal personen, Tafels -> gereserveerde tafels die al gekoppeld zijn.
                    break;

                case '0':
                    return;

                default:
                    wrongInput = true;
                    break;
                }
                return;
            }
        }
        public void changeReservering(Reservering reservering, TafelArray tafels)
        {
            while (true)
            {
                Console.Clear();
                reservering.Info();
                Console.WriteLine("\nR: Verwijder reservering\n0: Terug");
                ConsoleKeyInfo toetsUser     = Console.ReadKey();
                char           toetsUserChar = toetsUser.KeyChar;
                if (toetsUserChar == '0')
                {
                    return;
                }
                if (toetsUserChar == 'R' || toetsUserChar == 'r')
                {
                    while (true)
                    {
                        Console.Clear();
                        Console.WriteLine(ASCIIART.ReserverenArt());
                        Console.WriteLine($"Weet u zeker dat u uw reservering voor {reservering.Datum} wil verwijderen?\n\nR: Verwijder reservering\n0: Terug");

                        ConsoleKeyInfo toetsUserBevestig     = Console.ReadKey();
                        char           toetsUserBevestigChar = toetsUserBevestig.KeyChar;

                        if (toetsUserBevestigChar == '0')
                        {
                            break;
                        }
                        if (toetsUserBevestigChar == 'r' || toetsUserBevestigChar == 'R')
                        {
                            removeReservering(reservering, tafels);
                            Console.Clear();
                            Console.WriteLine(ASCIIART.ReserverenArt());
                            Console.WriteLine("Uw reservering is succesvol verwijderd\n\n0: Terug");
                            Console.ReadKey();
                            return;
                        }
                    }
                }
            }
        }
        public void RemoveTafels(TafelArray tafels, bool klantCall = false) //klantCall is een variabele die op true wordt gezet als er vanuit een klant een reservering wordt verwijderd.
        {
            bool wrongInput = false;

            while (true)
            {
                if (klantCall)
                {
                    this.Tafels = tafels.AllesAutomatischOntkoppelen(this.Tafels, $"{this.Tijd}{this.Datum}", true);
                    return;
                }
                Console.Clear();
                Console.WriteLine(ASCIIART.TafelsOntkoppelenArt());
                Console.WriteLine("1: Alles ontkoppelen");
                Console.WriteLine("2: Ontkoppelen met tafel ID");
                Console.WriteLine("0: Terug");
                if (wrongInput)
                {
                    Console.WriteLine("Wrong input! Probeer 1, 2 of 0");
                }
                char userInput = Console.ReadKey().KeyChar;
                switch (userInput)
                {
                case '1':
                    this.Tafels = tafels.AllesAutomatischOntkoppelen(this.Tafels, $"{this.Tijd}{this.Datum}");
                    break;

                case '2':
                    this.Tafels = tafels.OntKoppelenMetID(this.Tafels, $"{this.Tijd}{this.Datum}");
                    break;

                case '0':
                    return;

                default:
                    wrongInput = true;
                    break;
                }
            }
        }
        public void BekijkSpecifiekePaginaMedewerker(Reservering[] RelevanteReserveringen, TafelArray tafels, string datum) //Laat specifieke reserveringen zien op paginas
        {
            int  huidigePaginaNR = 0;
            bool wrongInput      = false;

            while (true)
            {
                int hoeveelheidPaginas = (int)Math.Ceiling(RelevanteReserveringen.Length / 7.0); //berekent het aantal paginas door het te delen door 7
                Console.Clear();
                Console.WriteLine(ASCIIART.ReserveringenArt());
                Console.WriteLine($"{datum}\nPagina {huidigePaginaNR + 1}/{hoeveelheidPaginas}\n");
                for (int i = 0; i < 7 && i + huidigePaginaNR * 7 < RelevanteReserveringen.Length; i++) //laat de correcte reserveringen zien van een bepaalde tafel
                {
                    Console.WriteLine($"{i + 1}: {RelevanteReserveringen[i + huidigePaginaNR * 7].TijdString()} {RelevanteReserveringen[i + huidigePaginaNR * 7].Bezoeker} ({RelevanteReserveringen[i + huidigePaginaNR * 7].Personen} personen)");
                }
                Console.WriteLine();
                if (huidigePaginaNR + 1 < hoeveelheidPaginas)
                {
                    Console.WriteLine("8: Volgende pagina");
                }
                if (huidigePaginaNR + 1 >= hoeveelheidPaginas && (hoeveelheidPaginas > 1))
                {
                    Console.WriteLine("9: Vorige pagina");
                }
                Console.WriteLine("0: Ga terug naar het startscherm");
                if (wrongInput)
                {
                    Console.WriteLine("Verkeerde input!");
                    wrongInput = false;
                }
                try
                {
                    int Index = Int32.Parse(Console.ReadKey().KeyChar.ToString());
                    if (Index == 0)
                    {
                        return;
                    }
                    if (Index > 0 && Index < 8)
                    {
                        try
                        {
                            BekijkSpecifiekeReserveringMedewerker(RelevanteReserveringen[Index - 1], tafels);
                        }
                        catch (IndexOutOfRangeException)
                        {
                            wrongInput = true;
                        }
                    }
                    else if (Index == 8 && huidigePaginaNR + 1 < hoeveelheidPaginas)
                    {
                        huidigePaginaNR++;
                    }
                    else if (Index == 9 && huidigePaginaNR + 1 >= hoeveelheidPaginas && (hoeveelheidPaginas > 1))
                    {
                        huidigePaginaNR--;
                    }
                    else
                    {
                        Console.WriteLine("Dit is geen geldige input");
                        Console.WriteLine("\x0a" + "Enter: Ga terug naar het vorige scherm");
                        Console.ReadKey();
                    }
                }
                catch (FormatException)
                {
                    wrongInput = true;
                }
            }
        }
        public void BekijkReserveringenKlant(string klantNaam, TafelArray tafels)
        {
            if (Reserveringen == null) //als er geen reserveringen zijn nog, maakt een nieuwe reservering aan met 0.
            {
                Reserveringen = new Reservering[0];
            }

            if (Reserveringen.Length == 0) //als er 0 reserveringen zijn voor de klant dan returnt de code
            {
                Console.Clear();
                Console.WriteLine(ASCIIART.ReserverenArt());
                Console.WriteLine("U heeft nog geen reserveringen gemaakt\x0a\x0a" + "Enter: Ga terug naar het startscherm");
                Console.ReadKey();
                return;
            }
            int huidigePaginaNR = 0;

            while (true)
            {
                int Aantal = 0;
                foreach (Reservering reservering in Reserveringen)
                {
                    if (reservering.Bezoeker == klantNaam)
                    {
                        Aantal++;
                    }
                }
                if (Aantal == 0)
                {
                    return;
                }
                Reservering[] KlantReserveringen = new Reservering[Aantal];
                int           j = 0;
                for (int i = 0; i < Reserveringen.Length; i++)
                {
                    if (Reserveringen[i].Bezoeker == klantNaam)
                    {
                        KlantReserveringen[j++] = Reserveringen[i];
                    }
                }
                int hoeveelheidPaginas = (int)Math.Ceiling(KlantReserveringen.Length / 7.0);
                Console.Clear();
                Console.WriteLine(ASCIIART.ReserveringenArt());
                Console.WriteLine($"Pagina {huidigePaginaNR + 1}/{hoeveelheidPaginas}\n");
                for (int i = 0; i < 7 && i + huidigePaginaNR * 7 < KlantReserveringen.Length; i++)
                {
                    Console.WriteLine($"{i + 1}: {KlantReserveringen[i + huidigePaginaNR * 7].Datum} om {KlantReserveringen[i + huidigePaginaNR * 7].TijdString()} ({KlantReserveringen[i + huidigePaginaNR * 7].Personen} personen)");
                }

                Console.WriteLine();
                if (huidigePaginaNR + 1 < hoeveelheidPaginas)
                {
                    Console.WriteLine("8: Volgende pagina");
                }
                if (huidigePaginaNR + 1 >= hoeveelheidPaginas && (hoeveelheidPaginas > 1))
                {
                    Console.WriteLine("9: Vorige pagina");
                }
                Console.WriteLine("0: Ga terug naar het startscherm");
                int Index = Int32.Parse(Console.ReadKey().KeyChar.ToString());
                Console.Clear();
                if (Index == 0)
                {
                    return;
                }
                if (Index < 7 && Index > 0)
                {
                    changeReservering(KlantReserveringen[Index - 1], tafels);
                }
                else if (Index == 8 && huidigePaginaNR + 1 < hoeveelheidPaginas)
                {
                    huidigePaginaNR++;
                }
                else if (Index == 9 && huidigePaginaNR + 1 >= hoeveelheidPaginas && (hoeveelheidPaginas > 1))
                {
                    huidigePaginaNR--;
                }
                else
                {
                    Console.WriteLine("Dit is geen geldige input\x0a\x0a" + "Enter: Ga terug naar het vorige scherm");
                    Console.ReadKey();
                }
            }
        }