package com.example.vpr_javafx;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * Data is a class to edit files.
 *
 * @author Madeleine Vigier
 * @version 1.3
 */
public class Data {
    private String pathRead;

    public Data(String pathRead) {
        this.pathRead = pathRead;
    }

    /**
     * readUser() is a method to split user.txt into lines and save them in an arraylist
     *
     * @return Arraylist userList
     * @author Madeleine Vigier, Sabine Gubitz
     */
    public ArrayList<com.example.vpr_javafx.User> readUser() {
        List<String> rows = getRows();
        ArrayList<com.example.vpr_javafx.User> userList = new ArrayList<>();

        for (String row : rows) {
            String[] parts = row.split(";");

            String nameParent1 = parts[0];
            String nameParent2 = parts[1];
            String billAddress = parts[2];
            String phonenumber = parts[3];
            String nameChildren = parts[4];
            String password = parts[5];
            userList.add(new com.example.vpr_javafx.User(nameParent1, nameParent2, billAddress, phonenumber, nameChildren, password));
        }
        return userList;

    }


    /**
     * readMenue() is a method to split menue.txt into lines and save them in an arraylist
     *
     * @return Arraylist menuelist
     * @author Madeleine Vigier, Sabine Gubitz
     */
    public ArrayList<com.example.vpr_javafx.Menu> readMenu() {

        List<String> rows = getRows();
        ArrayList<com.example.vpr_javafx.Menu> menuList = new ArrayList<>();


        for (String row : rows) {

            String[] parts = row.split(";");


            String date = parts[0];
            String dish = parts[1];
            String sideDish = parts[2];
            String typ = parts[3];
            String ingredient = parts[4];

            List<String> ingredients = new ArrayList<>();

            if (!ingredient.isEmpty()) {
                ingredients.add("a"); //eggs
            }

            ingredient = parts[5];
            if (!ingredient.isEmpty()) {
                ingredients.add("d"); //peanuts
            }
            ingredient = parts[6];
            if (!ingredient.isEmpty()) {
                ingredients.add("m"); //fish
            }
            ingredient = parts[7];
            if (!ingredient.isEmpty()) {
                ingredients.add("g"); //grains
            }
            ingredient = parts[8];
            if (!ingredient.isEmpty()) {
                ingredients.add("f"); //crustaceans
            }
            ingredient = parts[9];
            if (!ingredient.isEmpty()) {
                ingredients.add("n"); //lupines
            }
            ingredient = parts[10];
            if (!ingredient.isEmpty()) {
                ingredients.add("c"); //milk
            }
            ingredient = parts[11];
            if (!ingredient.isEmpty()) {
                ingredients.add("k"); //nuts
            }
            ingredient = parts[12];
            if (!ingredient.isEmpty()) {
                ingredients.add("j"); //sulfurDioxideAndSulfite
            }
            ingredient = parts[13];

            if (!ingredient.isEmpty()) {
                ingredients.add("l"); //celeriac
            }
            ingredient = parts[14];
            if (!ingredient.isEmpty()) {
                ingredients.add("h"); //mustards
            }
            ingredient = parts[15];
            if (!ingredient.isEmpty()) {
                ingredients.add("i"); //sesame
            }
            ingredient = parts[16];
            if (!ingredient.isEmpty()) {
                ingredients.add("b");//soy
            }
            ingredient = parts[17];
            if (!ingredient.isEmpty()) {
                ingredients.add("e");//molluscs
            }
            ingredient = parts[18];
            if (!ingredient.isEmpty()) {
                ingredients.add("4"); //antioxidant
            }
            ingredient = parts[19];
            if (!ingredient.isEmpty()) {
                ingredients.add("5");
            }
            ingredient = parts[20];
            if (!ingredient.isEmpty()) {
                ingredients.add("6"); //flavourEnhancer
            }
            ingredient = parts[21];
            if (!ingredient.isEmpty()) {
                ingredients.add("8"); // preservatives
            }
            ingredient = parts[22];

            if (!ingredient.isEmpty()) {
                ingredients.add("3"); //nitrate
            }
            ingredient = parts[23];
            if (!ingredient.isEmpty()) {
                ingredients.add("1");//picklingSalt
            }
            ingredient = parts[24];
            if (!ingredient.isEmpty()) {
                ingredients.add("7"); //artificialSweetener
            }
            ingredient = parts[25];
            if (!ingredient.isEmpty()) {
                ingredients.add("2"); //phosphate

            }
            String end = parts[26]; //endpoint

            menuList.add(new com.example.vpr_javafx.Menu(date, dish, sideDish, typ, ingredients));
        }
        return menuList;
    }


    /**
     * readOrder() is a method to split order.txt into lines and save them in an arraylist
     *
     * @return Arraylist orderlist
     * @author Madeleine Vigier, Sabine Gubitz
     */
    public ArrayList<com.example.vpr_javafx.Order> readOrder() {

        ArrayList<com.example.vpr_javafx.Order> orderList = new ArrayList<>();
        List<String> rows = getRows();

        for (String row : rows) {
            String[] parts = row.split(";");

            String date = parts[0];
            String user = parts[1];
            String mealtype = parts[3];
            String deserttype = parts[5];
            orderList.add(new com.example.vpr_javafx.Order(date, user, mealtype, deserttype));
        }
        return null;//orderList

    }

    /**
     * The method writeData writes the data of a List into a txt file.
     *
     * @author Felix Wöstemeyer
     *
     * @param pathWrite   determines the filename of the file that will be written
     * @param listToWrite determines which ArrayList is to be used for writing the file
     */
    public void writeData(String pathWrite, ArrayList<String> listToWrite) {
        try {
            if (new File(pathWrite).exists()) {
                for (String zeile : listToWrite) {
                    new FileWriter(pathWrite).write(zeile);
                }
            }else
            {
                Scanner scanner = new Scanner(System.in);
                System.out.println("Der Pfad oder die  Datei "+ pathWrite +" existiert nicht!\nMöchten Sie unter dem Pfad "+ pathWrite+ " eine neue Datei erstellen? (Y/N)");
                if(scanner.nextLine().equals("Y")){
                    new File(pathWrite).createNewFile();
                    System.out.println("Die Datei "+ pathWrite+" wurde erfolgreich erstellt");
                }else if(!scanner.nextLine().equals("N") && !scanner.nextLine().equals("Y")){
                    System.out.println("Es ist ein Fehler mit ihrer Antwort aufgetreten!");
                }
            }
        }catch(IOException e){
            e.printStackTrace();
        }
    }

    /**
     * The method gets the rows by reading all lines of the path
     *
     * @return ArrayList rows
     * @author Madeleine Vigier
     */
    private List<String> getRows() {
        Path path = Paths.get(pathRead);
        List<String> rows = new ArrayList<>();
        try {
            rows = Files.readAllLines(path);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return rows;
    }

    /**
     * The method validates the user input
     *
     * @return boolean inputValid
     * @author Kevin Maier
     */
    private boolean validateData(String password, String phoneNumber)
    {
        boolean inputValid = false;
        boolean phoneNumberMatchFound;
        boolean passwordMatchFound;
        boolean phoneNumberValid = false;
        boolean passwordValid = false;

        Pattern phoneNumberPattern = Pattern.compile("[0-9]*");
        Pattern passwordPattern = Pattern.compile("^(?=.*[A-Za-z])(?=.*\\d)[A-Za-z\\d]{8,}$");

        Scanner reader = new Scanner(System.in);

        while(password.isEmpty() || phoneNumber.isEmpty())
        {
            System.out.println("Login fehlgeschlagen. Eingabe ist leer, versuchen Sie es erneut.");
            System.out.println("");
            System.out.print("Telefonnummer: ");
            phoneNumber = reader.nextLine();
            System.out.print("Passwort: ");
            password = reader.nextLine();
        }

        Matcher phoneNumberMatcher = phoneNumberPattern.matcher(phoneNumber);
        Matcher passwordMatcher = passwordPattern.matcher(password);

        phoneNumberMatchFound = phoneNumberMatcher.find();
        passwordMatchFound = passwordMatcher.find();

        while (!inputValid) {
            if (!phoneNumberMatchFound || phoneNumber.length() != 15) {
                System.out.println("Login fehlgeschlagen. Die eingegebene Handynummer ist nicht valide.");
                System.out.println("");
                System.out.print("Telefonnummer: ");
                phoneNumber = reader.nextLine();
                System.out.print("Passwort: ");
                password = reader.nextLine();
            } else {
                phoneNumberValid = true;
            }

            if (!passwordMatchFound || password.length() < 6 || password.length() > 20) {
                System.out.println("Login fehlgeschlagen. Das eingegebene Passwort ist nicht valide.");
                System.out.println("");
                System.out.print("Telefonnummer: ");
                phoneNumber = reader.nextLine();
                System.out.print("Passwort: ");
                password = reader.nextLine();
            } else {
                passwordValid = true;
            }

            if (phoneNumberValid && passwordValid) {
                inputValid = true;
            }
        }
        return inputValid;
    }

    /**
     * The method changes the orders.txt file by removing canceled orders
     *
     * @return ArrayList\<Order> changedOrderList
     * @author Felix Düsterhaus
     */

    public ArrayList<com.example.vpr_javafx.Order> changeOrder(String userLogin) {

        /*
        File orderFile = new File("C:/Unterricht/VPR/orders.txt");
        if (orderFile.delete()) {
            System.out.println("Datei gelöscht: " + orderFile.getName());
        } else {
            System.out.println("Fehler, " + orderFile.getName() + " nicht gelöscht.");
        }
        */

        ArrayList<com.example.vpr_javafx.Order> changedOrderList = new ArrayList<>();
        List<String> rows = getRows();
        int changedEntries = 0;

        for (String row : rows) {
            String[] parts = row.split(";");

            String date = parts[0];
            String user = parts[1];
            String mealtyp = parts[2];
            String deserttyp = parts[3];
            if(!userLogin.equals(user)) {
                changedOrderList.add(new com.example.vpr_javafx.Order(date, user, mealtyp, deserttyp));
            } else {
                changedEntries++;
            }
        }

        try {
            FileWriter writer = new FileWriter("orders2.txt");
            for(com.example.vpr_javafx.Order str: changedOrderList) {
                writer.write(str + System.lineSeparator());
            }
            writer.close();
            System.out.println("Daten gelöscht");
            System.out.println(changedEntries + " Einträge entfernt.");
        } catch (IOException e) {
            e.printStackTrace();
        }
        return changedOrderList;
    }
}