import java.io.IOException;
import java.math.BigDecimal;
import java.nio.file.Files;
import java.nio.file.Path;
import java.time.LocalDate;
import java.util.Locale;

// Bagian 3: penyimpanan berkas, pencarian kata kunci, dan filter stok menipis.
public class DemoGudang {

    public static void main(String[] args) throws IOException {
        Path berkas = Path.of("gudang.txt");
        Files.deleteIfExists(berkas);   // mulai dari bersih agar demo dapat diulang

        // 1. Satu sesi operasional lengkap dengan penyimpanan berkas.
        Gudang gudang = new Gudang(new GudangRepositoryBerkas(berkas));
        isiData(gudang);
        gudang.barangMasuk("BRG-001", 50, LocalDate.of(2026, 1, 5), "Budi", "penerimaan awal");
        gudang.barangMasuk("BRG-002", 10, LocalDate.of(2026, 1, 5), "Budi", "penerimaan awal");
        gudang.barangMasuk("BRG-003", 20, LocalDate.of(2026, 1, 6), "Dewi", "penerimaan awal");
        gudang.barangMasuk("BRG-004", 12, LocalDate.of(2026, 1, 6), "Dewi", "penerimaan awal");
        gudang.barangMasuk("BRG-005", 30, LocalDate.of(2026, 1, 7), "Dewi", "penerimaan awal");
        gudang.barangKeluar("BRG-001", 25, LocalDate.of(2026, 1, 15), "Siti",
                "permintaan divisi keuangan");
        gudang.barangKeluar("BRG-002", 8, LocalDate.of(2026, 1, 20), "Siti",
                "permintaan divisi pemasaran");
        gudang.barangKeluar("BRG-003", 17, LocalDate.of(2026, 1, 22), "Siti",
                "permintaan divisi keuangan");

        System.out.println("== Tabel barang (sesi pertama) ==");
        for (Barang b : gudang.semuaBarang()) {
            System.out.printf(Locale.US, "%-8s %-22s %-6s %6d%n",
                    b.kode(), b.nama(), b.satuan(), b.stok());
        }

        // 2. Buka ulang berkas yang sama: data bertahan melewati akhir program.
        Gudang dibuka = new Gudang(new GudangRepositoryBerkas(berkas));
        System.out.println();
        System.out.println("setelah dibuka ulang : " + dibuka.semuaBarang().size()
                + " barang, " + dibuka.riwayat().size() + " mutasi");
        System.out.println("stok BRG-002 bertahan: " + dibuka.cariBarang("BRG-002").stok()
                + " BOTOL");
        MutasiStok lanjutan = dibuka.barangMasuk("BRG-002", 6,
                LocalDate.of(2026, 1, 25), "Budi", "pembelian rutin");
        System.out.println("mutasi baru          : " + lanjutan);

        // 3. Pencarian kata kunci: tidak peka huruf besar-kecil.
        System.out.println();
        System.out.println("== cari \"kertas\" ==");
        for (Barang b : dibuka.cariKataKunci("kertas")) {
            System.out.println("hasil : " + b.nama() + " (" + b.stok() + " " + b.satuan() + ")");
        }
        System.out.println("== cari \"KERTAS\" ==");
        System.out.println("hasil : " + dibuka.cariKataKunci("KERTAS").size() + " barang");

        // 4. Filter barang yang perlu dipesan ulang.
        System.out.println();
        System.out.println("== barang perlu restok ==");
        for (Barang b : dibuka.barangPerluRestok()) {
            System.out.printf(Locale.US, "hasil : %-22s stok %d, minimum %d%n",
                    b.nama(), b.stok(), b.stokMinimum());
        }

        // 5. Kartu stok: seluruh mutasi satu barang dari awal.
        System.out.println();
        System.out.println("== kartu stok BRG-002 ==");
        for (MutasiStok m : dibuka.riwayatBarang("BRG-002")) {
            System.out.printf(Locale.US, "#%-2d %s %-6s %3d  %s%n",
                    m.id(), m.tanggal(), m.jenis(), m.jumlah(), m.petugas());
        }
    }

    static void isiData(Gudang gudang) {
        gudang.daftar(new Barang("BRG-001", "Kertas HVS A4", "RIM",
                new BigDecimal("47500"), 0, 10));
        gudang.daftar(new Barang("BRG-002", "Tinta Printer Hitam", "BOTOL",
                new BigDecimal("185000"), 0, 8));
        gudang.daftar(new Barang("BRG-003", "Kertas HVS F4", "RIM",
                new BigDecimal("52000"), 0, 8));
        gudang.daftar(new Barang("BRG-004", "Pulpen Gel Hitam 0.5", "BOX",
                new BigDecimal("62000"), 0, 5));
        gudang.daftar(new Barang("BRG-005", "Amplop Cokelat Folio", "PAK",
                new BigDecimal("15500"), 0, 10));
    }
}
