/* main.c - Program utama Pengelola Inventaris */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

#include "inventory.h"
#include "storage.h"

#define DB_PATH "inventory.csv"

/* Membersihkan stdin dari karakter sisa setelah scanf. */
static void flush_stdin(void) {
    int c;
    while ((c = getchar()) != '\n' && c != EOF) {
        /* loop sampai newline */
    }
}

/* Membaca satu baris teks dari stdin dengan aman. */
static int read_line(char *buf, size_t cap) {
    if (fgets(buf, (int)cap, stdin) == NULL) {
        return -1;
    }
    size_t len = strlen(buf);
    while (len > 0 && (buf[len - 1] == '\n' || buf[len - 1] == '\r')) {
        buf[--len] = '\0';
    }
    return 0;
}

/* Menampilkan menu utama. */
static void print_menu(void) {
    puts("");
    puts("=== Pengelola Inventaris ===");
    puts("1. Tambah produk");
    puts("2. Daftar semua produk");
    puts("3. Cari produk (id)");
    puts("4. Cari produk (nama)");
    puts("5. Update harga/stok");
    puts("6. Hapus produk");
    puts("7. Urutkan berdasarkan nama");
    puts("8. Urutkan berdasarkan harga");
    puts("9. Simpan ke file");
    puts("0. Muat dari file");
    puts("Q. Keluar");
    printf("Pilihan: ");
}

static void do_add(Inventory *inv) {
    char name[PRODUCT_NAME_MAX];
    char price_buf[32];
    char stock_buf[16];

    printf("Nama produk: ");
    if (read_line(name, sizeof(name)) != 0) {
        return;
    }
    printf("Harga (Rp): ");
    if (read_line(price_buf, sizeof(price_buf)) != 0) {
        return;
    }
    printf("Stok: ");
    if (read_line(stock_buf, sizeof(stock_buf)) != 0) {
        return;
    }

    double price = strtod(price_buf, NULL);
    int stock = (int)strtol(stock_buf, NULL, 10);
    int id = inventory_add(inv, name, price, stock);
    if (id < 0) {
        printf("Gagal menambah produk. Periksa kembali input Anda.\n");
        return;
    }
    printf("Produk ditambahkan dengan id=%d\n", id);
}

static void do_list(const Inventory *inv) {
    inventory_print_all(inv);
}

static void do_find_id(Inventory *inv) {
    int id;
    printf("Masukkan id: ");
    if (scanf("%d", &id) != 1) {
        flush_stdin();
        printf("Input tidak valid.\n");
        return;
    }
    flush_stdin();
    Product *p = inventory_find_by_id(inv, id);
    if (p == NULL) {
        printf("Produk dengan id %d tidak ditemukan.\n", id);
        return;
    }
    product_print(p);
}

static void do_find_name(Inventory *inv) {
    char keyword[PRODUCT_NAME_MAX];
    Product results[16];
    printf("Kata kunci nama: ");
    if (read_line(keyword, sizeof(keyword)) != 0) {
        return;
    }
    int n = inventory_find_by_name(inv, keyword, results, 16);
    printf("Ditemukan %d produk:\n", n);
    for (int i = 0; i < n; i++) {
        product_print(&results[i]);
    }
}

static void do_update(Inventory *inv) {
    int id;
    printf("Masukkan id: ");
    if (scanf("%d", &id) != 1) {
        flush_stdin();
        printf("Input tidak valid.\n");
        return;
    }
    flush_stdin();
    char price_buf[32];
    char stock_buf[16];
    printf("Harga baru (Rp): ");
    read_line(price_buf, sizeof(price_buf));
    printf("Stok baru: ");
    read_line(stock_buf, sizeof(stock_buf));
    double price = strtod(price_buf, NULL);
    int stock = (int)strtol(stock_buf, NULL, 10);
    if (inventory_update(inv, id, price, stock) != 0) {
        printf("Gagal memperbarui produk id %d.\n", id);
        return;
    }
    printf("Produk id %d diperbarui.\n", id);
}

static void do_delete(Inventory *inv) {
    int id;
    printf("Masukkan id: ");
    if (scanf("%d", &id) != 1) {
        flush_stdin();
        printf("Input tidak valid.\n");
        return;
    }
    flush_stdin();
    if (inventory_delete(inv, id) != 0) {
        printf("Produk id %d tidak ditemukan.\n", id);
        return;
    }
    printf("Produk id %d dihapus.\n", id);
}

int main(void) {
    Inventory inv;
    inventory_init(&inv);

    /* Auto-load bila database sudah ada. */
    if (storage_load(&inv, DB_PATH) > 0) {
        printf("Memuat %d produk dari %s\n", inv.count, DB_PATH);
    }

    char choice[8];
    int running = 1;
    while (running) {
        print_menu();
        if (read_line(choice, sizeof(choice)) != 0) {
            break;
        }
        char c = (char)tolower((unsigned char)choice[0]);
        switch (c) {
            case '1': do_add(&inv); break;
            case '2': do_list(&inv); break;
            case '3': do_find_id(&inv); break;
            case '4': do_find_name(&inv); break;
            case '5': do_update(&inv); break;
            case '6': do_delete(&inv); break;
            case '7': inventory_sort_by_name(&inv);
                      puts("Diurutkan berdasarkan nama."); break;
            case '8': inventory_sort_by_price(&inv);
                      puts("Diurutkan berdasarkan harga."); break;
            case '9': {
                int n = storage_save(&inv, DB_PATH);
                if (n >= 0) {
                    printf("Menyimpan %d produk ke %s\n", n, DB_PATH);
                } else {
                    printf("Gagal menyimpan ke %s\n", DB_PATH);
                }
                break;
            }
            case '0': {
                int n = storage_load(&inv, DB_PATH);
                if (n >= 0) {
                    printf("Memuat %d produk dari %s\n", n, DB_PATH);
                } else {
                    printf("Gagal memuat dari %s\n", DB_PATH);
                }
                break;
            }
            case 'q': running = 0; break;
            default:  printf("Pilihan tidak dikenal: %c\n", c); break;
        }
    }
    puts("Terima kasih telah menggunakan Pengelola Inventaris.");
    return 0;
}
