-- =====================================================================
-- SKParking - Skema Database Pusat (MySQL, dijalankan di cPanel hosting)
-- =====================================================================
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ---------------------------------------------------------------------
-- 1. PENGATURAN GLOBAL (Web Admin) -> nama perusahaan/lokasi, tarif dasar,
--    payment gateway aktif, dsb. Key-Value biar fleksibel ditambah tanpa alter table.
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS pengaturan_global (
    id INT AUTO_INCREMENT PRIMARY KEY,
    kategori VARCHAR(50) NOT NULL,           -- 'umum', 'tarif', 'payment_gateway', 'notifikasi'
    kunci VARCHAR(100) NOT NULL,             -- 'nama_perusahaan', 'tarif_motor_jam_pertama', dst
    nilai TEXT NULL,
    tipe_data ENUM('string','number','boolean','json') DEFAULT 'string',
    keterangan VARCHAR(255) NULL,
    updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    UNIQUE KEY uq_kategori_kunci (kategori, kunci)
) ENGINE=InnoDB;

-- Seed nilai default pengaturan umum
INSERT INTO pengaturan_global (kategori, kunci, nilai, tipe_data, keterangan) VALUES
('umum', 'nama_perusahaan', 'SKParking', 'string', 'Nama yang tampil di dashboard & struk'),
('umum', 'alamat', '', 'string', 'Alamat lokasi parkir'),
('umum', 'logo_url', '', 'string', 'URL logo perusahaan'),
('tarif', 'tarif_motor_jam_pertama', '2000', 'number', 'Tarif motor jam pertama (Rp)'),
('tarif', 'tarif_motor_jam_berikutnya', '1000', 'number', 'Tarif motor per jam berikutnya (Rp)'),
('tarif', 'tarif_mobil_jam_pertama', '5000', 'number', 'Tarif mobil jam pertama (Rp)'),
('tarif', 'tarif_mobil_jam_berikutnya', '2000', 'number', 'Tarif mobil per jam berikutnya (Rp)'),
('tarif', 'tarif_maks_harian', '50000', 'number', 'Batas tarif maksimal per hari (Rp), 0 = tidak ada batas'),
('payment_gateway', 'provider_aktif', 'none', 'string', 'none | tripay | midtrans | xendit'),
('payment_gateway', 'merchant_code', '', 'string', 'Kode merchant provider'),
('payment_gateway', 'api_key', '', 'string', 'API key provider (private)'),
('payment_gateway', 'callback_secret', '', 'string', 'Secret untuk validasi webhook'),
('notifikasi', 'telegram_bot_token', '', 'string', 'Opsional, notifikasi anomali ke Telegram'),
('notifikasi', 'telegram_chat_id', '', 'string', 'Chat ID tujuan notifikasi')
ON DUPLICATE KEY UPDATE kategori = kategori;

-- ---------------------------------------------------------------------
-- 2. GATE (titik/portal fisik: Gate In / Gate Out), dengan pengaturan
--    per-gate yang bisa disetel dari Web Admin ATAU dari WinForms setup lokal.
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS gate (
    id INT AUTO_INCREMENT PRIMARY KEY,
    kode_gate VARCHAR(20) NOT NULL UNIQUE,        -- 'GATE-IN-1', 'GATE-OUT-1'
    nama_gate VARCHAR(100) NOT NULL,              -- nama tampilan, bebas diubah admin
    tipe_gate ENUM('in','out') NOT NULL,
    lokasi VARCHAR(150) NULL,
    api_token VARCHAR(64) NOT NULL UNIQUE,        -- token auth dipakai WinForms saat sync ke API
    status ENUM('aktif','nonaktif','maintenance') DEFAULT 'aktif',
    last_heartbeat DATETIME NULL,
    last_ip VARCHAR(45) NULL,
    versi_aplikasi VARCHAR(20) NULL,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB;

-- Pengaturan spesifik tiap gate (komponen hardware, port serial, kamera, dll)
-- Disimpan sebagai key-value juga supaya WinForms bebas nambah field baru
-- tanpa perlu migrasi tabel setiap saat.
CREATE TABLE IF NOT EXISTS gate_pengaturan (
    id INT AUTO_INCREMENT PRIMARY KEY,
    gate_id INT NOT NULL,
    kunci VARCHAR(100) NOT NULL,      -- 'com_port_barrier', 'com_port_printer', 'kamera_rtsp_url',
                                       -- 'alpr_aktif', 'printer_nama', 'printer_lebar_kertas', dst
    nilai TEXT NULL,
    updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    UNIQUE KEY uq_gate_kunci (gate_id, kunci),
    FOREIGN KEY (gate_id) REFERENCES gate(id) ON DELETE CASCADE
) ENGINE=InnoDB;

-- ---------------------------------------------------------------------
-- 3. PENGGUNA WEB ADMIN
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS admin_user (
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50) NOT NULL UNIQUE,
    password_hash VARCHAR(255) NOT NULL,
    nama_lengkap VARCHAR(100) NULL,
    peran ENUM('superadmin','operator','viewer') DEFAULT 'operator',
    aktif TINYINT(1) DEFAULT 1,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB;

-- ---------------------------------------------------------------------
-- 4. KENDARAAN & MEMBER (opsional, buat langganan bulanan)
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS member (
    id INT AUTO_INCREMENT PRIMARY KEY,
    nama VARCHAR(100) NOT NULL,
    no_plat VARCHAR(20) NOT NULL UNIQUE,
    jenis_kendaraan ENUM('motor','mobil') NOT NULL,
    tanggal_mulai DATE NOT NULL,
    tanggal_berakhir DATE NOT NULL,
    status ENUM('aktif','nonaktif','expired') DEFAULT 'aktif',
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB;

-- ---------------------------------------------------------------------
-- 5. TRANSAKSI PARKIR (sumber kebenaran pusat, hasil sync dari tiap gate)
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS transaksi (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    uuid VARCHAR(36) NOT NULL UNIQUE,             -- dibuat di lokal (SQLite) supaya id konsisten walau offline
    no_tiket VARCHAR(30) NOT NULL,
    gate_masuk_id INT NULL,
    gate_keluar_id INT NULL,
    no_plat VARCHAR(20) NULL,                     -- hasil ALPR, boleh kosong kalau gagal baca
    jenis_kendaraan ENUM('motor','mobil','tidak_diketahui') DEFAULT 'tidak_diketahui',
    waktu_masuk DATETIME NOT NULL,
    waktu_keluar DATETIME NULL,
    durasi_menit INT NULL,
    tarif INT NULL,
    metode_bayar ENUM('tunai','qris','member','gratis') NULL,
    payment_gateway VARCHAR(30) NULL,             -- tripay/midtrans/xendit
    payment_ref VARCHAR(100) NULL,                -- reference id dari gateway
    payment_status ENUM('pending','paid','expired','failed') NULL,
    qris_payload TEXT NULL,
    paid_at DATETIME NULL,
    foto_masuk_thumb_url VARCHAR(255) NULL,       -- thumbnail terkompresi, foto asli tetap di lokal
    foto_keluar_thumb_url VARCHAR(255) NULL,
    status ENUM('masuk','selesai','anomali') DEFAULT 'masuk',
    synced_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    KEY idx_no_tiket (no_tiket),
    KEY idx_waktu_masuk (waktu_masuk),
    KEY idx_status (status),
    FOREIGN KEY (gate_masuk_id) REFERENCES gate(id),
    FOREIGN KEY (gate_keluar_id) REFERENCES gate(id)
) ENGINE=InnoDB;

-- ---------------------------------------------------------------------
-- 6. HEARTBEAT & ANOMALI (jejak offline-safe)
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS heartbeat_log (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    gate_id INT NOT NULL,
    status ENUM('online','offline') NOT NULL,
    dicatat_pada DATETIME NOT NULL,               -- waktu asli kejadian di lokal (bisa beda dgn created_at kalau delay sync)
    diterima_pada DATETIME DEFAULT CURRENT_TIMESTAMP,
    keterangan VARCHAR(255) NULL,
    FOREIGN KEY (gate_id) REFERENCES gate(id)
) ENGINE=InnoDB;

CREATE TABLE IF NOT EXISTS anomali (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    gate_id INT NOT NULL,
    transaksi_uuid VARCHAR(36) NULL,
    jenis ENUM('alpr_gagal','barrier_macet','kamera_offline','printer_error','manual_override','lainnya') NOT NULL,
    deskripsi TEXT NULL,
    dicatat_pada DATETIME NOT NULL,
    diterima_pada DATETIME DEFAULT CURRENT_TIMESTAMP,
    ditangani TINYINT(1) DEFAULT 0,
    FOREIGN KEY (gate_id) REFERENCES gate(id)
) ENGINE=InnoDB;

-- ---------------------------------------------------------------------
-- 7. REKAP (biar laporan bulanan tetap cepat)
-- ---------------------------------------------------------------------
CREATE TABLE IF NOT EXISTS rekap_harian (
    id INT AUTO_INCREMENT PRIMARY KEY,
    tanggal DATE NOT NULL UNIQUE,
    total_transaksi INT DEFAULT 0,
    total_pendapatan BIGINT DEFAULT 0,
    total_motor INT DEFAULT 0,
    total_mobil INT DEFAULT 0,
    updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB;

CREATE TABLE IF NOT EXISTS rekap_bulanan (
    id INT AUTO_INCREMENT PRIMARY KEY,
    tahun INT NOT NULL,
    bulan INT NOT NULL,
    total_transaksi INT DEFAULT 0,
    total_pendapatan BIGINT DEFAULT 0,
    updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    UNIQUE KEY uq_tahun_bulan (tahun, bulan)
) ENGINE=InnoDB;

SET FOREIGN_KEY_CHECKS = 1;
