-- =====================================================================
-- 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' (dipakai kalau mode_printer = 'serial')
    ('mode_printer', 'serial'),    -- 'serial' | 'bluetooth' | 'usb'
    ('printer_nama_bluetooth', ''),-- nama device printer BT, mis. 'RPP02N'
    ('printer_alamat_bluetooth', ''), -- MAC address, format 00:11:22:33:44:55
    ('printer_pin_bluetooth', ''), -- PIN pairing, mis. '1234' atau '0000'
    ('printer_nama_windows', ''),  -- nama printer terdaftar di Windows (dipakai kalau mode_printer = 'usb')
    ('lebar_kertas_mm', '58'),     -- 58 atau 80, buat lebar garis pembatas struk
    ('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'),
    -- Reader kartu NFC/RFID
    ('mode_kartu', 'nonaktif'),        -- 'nonaktif' | 'keyboard_wedge' | 'serial'
    ('com_port_kartu', ''),            -- dipakai kalau mode_kartu = 'serial'
    -- Sapaan suara (TTS)
    ('suara_aktif', '1'),
    ('jam_pagi_mulai', '4'),           -- >=4 dan <11  -> "selamat pagi"
    ('jam_siang_mulai', '11'),         -- >=11 dan <15 -> "selamat siang"
    ('jam_sore_mulai', '15'),          -- >=15 dan <18 -> "selamat sore"
    ('jam_malam_mulai', '18'),         -- >=18 atau <4 -> "selamat malam"
    -- Branding & Iklan
    ('path_logo', ''),                 -- path file gambar logo (jpg/png), tampil di header
    ('iklan_aktif', '0'),
    ('folder_iklan', '');              -- folder berisi file video (mp4/wmv/avi) yang diputar bergiliran

-- ---------------------------------------------------------------------
-- 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_kartu TEXT,                        -- diisi kalau masuk/keluar via tap kartu member (NULL = kendaraan umum)
    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_kartu TEXT PRIMARY KEY,        -- UID kartu NFC/RFID, dipakai sebagai kunci lookup saat tap
    no_plat TEXT,
    nama TEXT,
    jenis_kendaraan TEXT,
    tanggal_berakhir TEXT,
    status TEXT,
    kategori TEXT,                    -- individu | perusahaan
    nama_pt TEXT,                     -- nama PT, diisi kalau kategori = perusahaan
    ditarik_pada TEXT DEFAULT (datetime('now','localtime'))
);