#include "wws.h"
#include "util.h"
#include <stdio.h>

int read_id() {
    printf("Produktnummer: ");
    int input = get_clean_int();
    if (input != ERRORRETURN) {return input;}
    else {
        printf("Die eingegebene Produktnummer ist keine Zahl.\n");
        return ERRORRETURN;
    }
}

char* read_name() {
    char* buffer;
    size_t buffsize = 0;
    printf("Name: ");
    ssize_t input_length = getline(&buffer, &buffsize, stdin);
    if (input_length == -1) {
        printf("Fehler beim lesen.\n");
        free(buffer);
        buffer = NULL;
    }
    return buffer;
}

double read_price() {
    printf("Preis: ");
    double price = get_clean_num();
    if (price == ERRORRETURN) {return ERRORRETURN;}
    return price;
}

int read_amount() {
    printf("Anzahl: ");
    int amount = get_clean_int();
    if (amount == ERRORRETURN) {return ERRORRETURN;}
    return amount;
}

int find_first_free_index(Customer customer) {
    for (int i = 0; i < ARRSIZE; i++) {
        if (customer.products[i] == NULL) {
            return i;
        }
    }
    printf("Für diesen Kunden können keine weiteren Produkte hinzugefügt werden.\n");
    return ERRORRETURN;
}

int find_product(Customer customer, int id) {
    for (int i = 0; i < ARRSIZE; i++) {
        if (customer.products[i]->id == id) {return i;}
    }
    return ERRORRETURN;
}

int find_customer(int id) {
    for (int i = 0; i < ARRSIZE; i++) {
        if (customers[i].id == id) {return id;}
    }
    return ERRORRETURN;
}

int add_product() {
    Product* new_product = (Product*) malloc(sizeof(Product));
    printf("**********************\n");
    printf("* WWS Produkteingabe *\n");
    printf("**********************\n");
    printf("Bitte geben Sie ihre Kundennumer ein: ");
    int customer_id = get_clean_int();
    if (customer_id == ERRORRETURN) {return ERRORRETURN;}
    Customer* customer = &customers[find_customer(customer_id)];
    new_product->id = read_id();
    if (new_product->id == ERRORRETURN) {return ERRORRETURN;}
    if (find_product(*customer, new_product->id)) {
        printf("Es existiert bereits ein Produkt mit dieser ID.\n");
        return ERRORRETURN;
    }
    new_product->name = read_name();
    if (!is_safe(new_product->name)) {
        printf("Der eingegebene Produktname enthält verbotene Zeichen.\n");
        return ERRORRETURN;
    }
    new_product->price = read_price();
    if (new_product->price == ERRORRETURN) {return ERRORRETURN;}
    new_product->amount = read_amount();
    if (new_product->amount == ERRORRETURN) {return ERRORRETURN;}
    int free_index = find_first_free_index(*customer);
    if (free_index == ERRORRETURN) {return ERRORRETURN;}
    customer->products[free_index] = new_product;
    return 0;
}

int print_product() {
    printf("**********************\n");
    printf("* WWS Produktausgabe *\n");
    printf("**********************\n");
    printf("Bitte geben Sie Ihre Kundennummer ein: ");
    int customer_id = get_clean_int();
    if (customer_id == ERRORRETURN) {return ERRORRETURN;}
    printf("Bitte geben Sie die gewünschte Produktnummer ein: ");
    int product_id = get_clean_int();
    if (product_id == ERRORRETURN) {return ERRORRETURN;}
    int product_index = find_product(customers[customer_id], product_id);
    if (product_index == ERRORRETURN) {
        printf("Die Produktnummer konnte nicht gefunden werden.\n");
        return ERRORRETURN;
    }
   
    Product* product = customers[customer_id].products[product_index];
    printf("Produktnummer: %d\n", product->id);
    printf("Produktname: %s\n", product->name);
    printf("Preis: %f\n", product->price);
    printf("Anzahl: %d\n", product->amount);
    return 0;
}

int add_customer() {
    Customer* new_customer = (Customer*) malloc(sizeof(Customer));
    if (new_customer == NULL) {
        printf("Fehler beim Speicher zuweisen");
        return ERRORRETURN;
    }
    printf("*********************\n");
    printf("* WWS Kundeneingabe *\n");
    printf("*********************\n");
    printf("Kundennummer: ");
    new_customer->id = get_clean_int();
    if (new_customer->id == ERRORRETURN) {return ERRORRETURN;}
    printf("Kundenname: ");
    new_customer->name = read_name();
    if (!is_safe(new_customer->name)) {
        printf("Der eigegebene Kundenname enthält verbotene Zeichen.\n");
        return ERRORRETURN;
    }
    for (int i = 0; i < ARRSIZE; i++) {
        if (customers[i].id == -1) {
            customers[i] = *new_customer;
            return 0;
        }
    }
    printf("Es können keine weiteren Kunden hinzugefügt werden.\n");
    return ERRORRETURN;
}

int print_customer() {
    printf("**********************\n");
    printf("* WWS Kundenausgabe *\n");
    printf("**********************\n");
    printf("Bitte geben Sie ihre Kundennummer ein: ");
    int id = get_clean_int();
    if (id == ERRORRETURN) {return ERRORRETURN;}
    int wanted_index = find_customer(id);
    if (wanted_index == ERRORRETURN) {
        printf("Die eingegebene Kundennummer konnte nicht gefunden werden.");
        return ERRORRETURN;
    }
    Customer customer = customers[wanted_index];
    printf("Kundennumer: %d\n", customer.id);
    printf("Name: %s\n", customer.name);
    return 0;
}

int menu() {
    printf("**********************\n");
    printf("*   WWS Menüsystem   *\n");
    printf("**********************\n");
    printf("1: Produkteingabe\n");
    printf("2: Produktausgabe\n");
    printf("3: Kundeneingabe\n");
    printf("4: Kundenausgabe\n");
    printf("5: Verlassen\n");
    printf("Auswahl: ");
    int input = get_clean_int();
    switch (input) {
        case 1:
            add_product();
            break;
        case 2:
            print_product();
            break;
        case 3:
            add_customer();
            break;
        case 4:
            print_customer();
            break;
        case 5:
            printf("Das System wird verlassen...\n");
            return EXITVAL;
    }
    return 0;
}
