-- =====================================================================
-- SKParking - Skema Database Lokal (SQLite, satu file per PC gate)
-- File: skparking_local.db, disimpan di %ProgramData%\SKParking\
-- =====================================================================
PRAGMA journal_mode = WAL;
PRAGMA foreign_keys = ON;

-- ---------------------------------------------------------------------
-- 1. PENGATURAN LOKAL GATE (diisi lewat FormSetup.cs saat instalasi awal)
--    Key-value biar gampang nambah field baru tanpa migrasi.
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS pengaturan_lokal (
    kunci TEXT PRIMARY KEY,
    nilai TEXT
);

-- Baris wajib diisi saat setup pertama kali (nilai default kosong, diisi via FormSetup):
INSERT OR IGNORE INTO pengaturan_lokal (kunci, nilai) VALUES
    ('kode_gate', ''),             -- 'GATE-IN-1' dsb, harus cocok dgn data di server pusat
    ('nama_gate', ''),             -- nama tampilan lokal, bebas
    ('tipe_gate', 'in'),           -- 'in' atau 'out'
    ('api_base_url', ''),          -- https://domain-lu.com/api
    ('api_token', ''),             -- token auth dari server pusat
    ('com_port_barrier', ''),      -- 'COM3'
    ('com_port_printer', ''),      -- 'COM4' (kalau bukan Bluetooth SPP)
    ('printer_nama_bluetooth', ''),-- nama device printer BT, mis. 'RPP02N'
    ('kamera_aktif', '0'),         -- '1'/'0'
    ('kamera_rtsp_url', ''),
    ('alpr_aktif', '0'),
    ('folder_simpan_foto', 'C:\\SKParkingData\\Foto'),
    ('mode_offline_maks_hari', '7'),-- batas retensi antrian sync sebelum warning
    ('sinkron_interval_detik', '5'),
    ('versi_aplikasi', '1.0.0');

-- ---------------------------------------------------------------------
-- 2. TRANSAKSI LOKAL (sumber utama saat offline, sync ke pusat kalau online)
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS transaksi_lokal (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    uuid TEXT NOT NULL UNIQUE,            -- dibuat di sini (Guid.NewGuid()), dipakai juga di server pusat
    no_tiket TEXT NOT NULL,
    no_plat TEXT,
    jenis_kendaraan TEXT DEFAULT 'tidak_diketahui',
    waktu_masuk TEXT NOT NULL,
    waktu_keluar TEXT,
    durasi_menit INTEGER,
    tarif INTEGER,
    metode_bayar TEXT,
    payment_gateway TEXT,
    payment_ref TEXT,
    payment_status TEXT,
    qris_payload TEXT,
    paid_at TEXT,
    path_foto_masuk TEXT,                 -- path file lokal penuh, foto ASLI tetap di sini selamanya
    path_foto_keluar TEXT,
    status TEXT DEFAULT 'masuk',          -- masuk | selesai | anomali
    synced INTEGER DEFAULT 0,             -- 0 = belum, 1 = sudah terkirim ke pusat
    dibuat_pada TEXT DEFAULT (datetime('now','localtime'))
);
CREATE INDEX IF NOT EXISTS idx_transaksi_synced ON transaksi_lokal(synced);
CREATE INDEX IF NOT EXISTS idx_transaksi_no_tiket ON transaksi_lokal(no_tiket);

-- ---------------------------------------------------------------------
-- 3. ANTRIAN SYNC GENERIK -- dipakai buat heartbeat & anomali juga,
--    biar background sync job cukup satu loop buat semua jenis data.
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS heartbeat_queue (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    status TEXT NOT NULL,                 -- online | offline
    dicatat_pada TEXT NOT NULL,
    synced INTEGER DEFAULT 0
);

CREATE TABLE IF NOT EXISTS anomali_lokal (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    transaksi_uuid TEXT,
    jenis TEXT NOT NULL,                  -- alpr_gagal | barrier_macet | kamera_offline | printer_error | manual_override | lainnya
    deskripsi TEXT,
    dicatat_pada TEXT NOT NULL,
    synced INTEGER DEFAULT 0
);

-- ---------------------------------------------------------------------
-- 4. CACHE TARIF & MEMBER (ditarik dari pusat berkala, biar tetap bisa
--    hitung tarif walau internet gate lagi mati)
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS cache_tarif (
    kunci TEXT PRIMARY KEY,
    nilai TEXT,
    ditarik_pada TEXT DEFAULT (datetime('now','localtime'))
);

CREATE TABLE IF NOT EXISTS cache_member (
    no_plat TEXT PRIMARY KEY,
    nama TEXT,
    jenis_kendaraan TEXT,
    tanggal_berakhir TEXT,
    status TEXT,
    ditarik_pada TEXT DEFAULT (datetime('now','localtime'))
);
