package shop.backend;
/*
Controller Klasse des Projektes.
TODO
Lager bestand für ein x beliebiges product bauen ----> Herr Hummels ansatz aus VL ausarbeiten
Cart übergeben
Order klasse integrieren
Logik ---> Product suchen & Kauf abschluss?


 */

import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.Scanner;

public class OnlineShop {
    ArrayList<Product> lager;

//ArrayList

    public OnlineShop() {
        lager = new ArrayList<Product>();

    }
    private void loadProductsAndParse(ArrayList<String> lines){
        for (int i = 1; i < lines.size(); i++){
            String line = lines.get(i);
            String[] partsOfList = line.split(",");
            int id = Integer.parseInt(partsOfList[0]);
            String name = partsOfList[1];
            double weight = Double.parseDouble(partsOfList[2]);
            double net = Double.parseDouble(partsOfList[3]);
            double mwst = Double.parseDouble(partsOfList[4]);
            int stock = Integer.parseInt(partsOfList[5]);
            Product prd = new Product(id,name,weight,net,mwst,stock);
            lager.add(prd);
        }
    }
    public ArrayList<Product> getLager(){
        return lager;
    }

    //aus VL
    public String[] productList() {
        String[] produkt = new String[lager.size()];
        for (int i = 0; i < lager.size(); i++)
            produkt[i] = lager.get(i).toString();

        return produkt;
    }

    public Product getProdId(int prodID){
        for(int i = 0; i < lager.size(); i++){
            Product prod = lager.get(i);
            if(prod.getProdID() == prodID){
                return prod;
            }
        }
        return null; //<------ Nichts gefunden. Referenz null
    }
    public ArrayList<Product> seachByName(String searchText){
        ArrayList<Product> result = new ArrayList<>();
        for(Product prod : lager){

            if(prod.getName().equalsIgnoreCase(searchText)){
                result.add(prod);
            }
        }
        return result;
    }
    public boolean reduceStock(Product prod, int quantity){
        if(prod.getStock() >= quantity){
            prod.setStock(prod.getStock() - quantity);
            return true;
        }
        return false;
    }


    // aus Sud
    public ArrayList<String> readFile(String path) throws FileNotFoundException {
        ArrayList<String> lines = new ArrayList<>();
        Scanner sc = new Scanner(new File(path));

        while (sc.hasNextLine()) {
            lines.add(sc.nextLine());
        }

        sc.close();
        return lines;
    }
    public void initShop(String csvPath) throws FileNotFoundException {
        ArrayList<String> lines = readFile(csvPath);
        loadProductsAndParse(lines);
    }


    /*Ich habe erst später verstanden, was genau business logik ist im ganzen.
    Zuweisungen sind keine Business logik... aber! wenn zustände verändert werden, dann schon.
    weshalb ich in TUI diesen Process checkoutlogik veränderen müsste bzw checkout

    */
    public Order checkOutLogic(Cart cart, String name, String addresse) {
        //Hier schaue ich auch ob es die bestimme menge gibt, wenn nicht --> Nullpointer
        for (CartPosition pos : cart.getPositions()) {
            Product product = pos.getProduct();
            if(product.getStock() < pos.getQuantity()){
                return null;
            }

        }
        //Habe genug deer Menge, kann reduziert werden
        for (CartPosition pos : cart.getPositions()) {
            reduceStock(pos.getProduct(), pos.getQuantity());
        }
        //Bestellung wird aufgegeben
        Order order = new Order(name,addresse,cart.getPositions());
        return order;
    }



}
