-- DHCPMan v0.16 — Tables supplémentaires (à exécuter après kea-admin db-init mysql)
-- Le schéma natif Kea est déjà en place.
-- Ce fichier est complet : une seule commande suffit pour une installation fraîche.

CREATE TABLE IF NOT EXISTS app_users (
    id            INT AUTO_INCREMENT PRIMARY KEY,
    username      VARCHAR(64)  NOT NULL UNIQUE,
    password_hash VARCHAR(255) NOT NULL,
    is_active     TINYINT(1)   NOT NULL DEFAULT 1,
    role          ENUM('admin','tech','viewer') NOT NULL DEFAULT 'tech',
    created_at    DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP,
    last_login    DATETIME     NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- Métadonnées des subnets (complète les infos Kea)
CREATE TABLE IF NOT EXISTS app_subnets (
    id               INT AUTO_INCREMENT PRIMARY KEY,
    kea_subnet_id    INT          NOT NULL UNIQUE COMMENT 'dhcp4_subnet_id dans Kea',
    name             VARCHAR(128) NOT NULL,
    cidr             VARCHAR(64)  NOT NULL COMMENT 'ex: 192.168.1.0/24',
    interface        VARCHAR(64)  NULL      COMMENT 'ex: igc0.30 (mode direct uniquement)',
    relay_address    VARCHAR(45)  NULL      COMMENT 'GIADDR — IP interface VLAN switch (mode relay)',
    gateway          VARCHAR(46)  NULL,
    dns_servers      VARCHAR(256) NULL      COMMENT 'séparés par virgule',
    ntp_servers      VARCHAR(256) NULL      COMMENT 'option 42 — activable par hôte',
    range_start      VARCHAR(46)  NULL      COMMENT 'début pool dynamique',
    range_end        VARCHAR(46)  NULL      COMMENT 'fin pool dynamique',
    short_lease_pool_start VARCHAR(45) DEFAULT NULL COMMENT 'début pool réservé aux hôtes short-lease',
    short_lease_pool_end   VARCHAR(45) DEFAULT NULL COMMENT 'fin pool réservé aux hôtes short-lease',
    has_dynamic_pool TINYINT(1)   NOT NULL DEFAULT 0,
    is_active        TINYINT(1)   NOT NULL DEFAULT 1 COMMENT '0 = exclu du syncToKea',
    is_public        TINYINT(1)   NOT NULL DEFAULT 0 COMMENT '1 = visible dans le formulaire de demande public',
    notes            TEXT         NULL,
    reserved_ips     TEXT         NULL      COMMENT 'IP/ranges réservés hors DHCP (1 par ligne, <ip-or-range>[#description])',
    created_at       DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- Métadonnées des réservations (complement de la table hosts Kea)
CREATE TABLE IF NOT EXISTS app_reservation_meta (
    host_id             INT          NOT NULL PRIMARY KEY COMMENT 'hosts.host_id Kea',
    description         VARCHAR(512) NULL,
    group_name          VARCHAR(64)  NULL,
    short_lease         TINYINT(1)   NOT NULL DEFAULT 0 COMMENT '1 = lease court 1h (client class short-lease)',
    created_by_user_id  INT          NULL,
    created_at          DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP,
    updated_by_user_id  INT          NULL,
    updated_at          DATETIME     NULL,
    FOREIGN KEY (created_by_user_id) REFERENCES app_users(id) ON DELETE SET NULL,
    FOREIGN KEY (updated_by_user_id) REFERENCES app_users(id) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- Journal des actions
CREATE TABLE IF NOT EXISTS app_audit_log (
    id          INT AUTO_INCREMENT PRIMARY KEY,
    user_id     INT          NULL,
    username    VARCHAR(64)  NULL,
    action      VARCHAR(64)  NOT NULL COMMENT 'ex: reservation.add, reservation.edit',
    object_type VARCHAR(64)  NULL,
    object_id   INT          NULL,
    details     TEXT         NULL COMMENT 'JSON ou texte libre',
    ip_address  VARCHAR(46)  NULL,
    created_at  DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP,
    INDEX idx_created_at (created_at),
    INDEX idx_user_id    (user_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- Configuration de l'application (clé/valeur)
CREATE TABLE IF NOT EXISTS app_settings (
    setting_key   VARCHAR(128) NOT NULL PRIMARY KEY,
    setting_value TEXT         NULL,
    description   VARCHAR(512) NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

INSERT INTO app_settings (setting_key, setting_value, description) VALUES
    ('app_name',          'DHCPMan',                    'Nom de l\'application'),
    ('domain_name',       'local',                      'Domaine par défaut pour les hostnames'),
    ('default_lease_time','86400',                      'Durée du bail DHCP par défaut (secondes)'),
    ('freebsd_mode',      '0',                          '1 = mode FreeBSD (kea-sync-from-db.py), 0 = mode AlmaLinux (API Kea directe)'),
    ('relay_mode',        '0',                          '1 = mode relay DHCP (GIADDR par subnet), 0 = mode direct (interface par subnet)'),
    ('relay_interface',   '',                           'Interface réseau du serveur Kea en mode relay (ex: eth0)'),
    ('kea_api_url',       'http://localhost:8000',      'URL du Kea Control Agent'),
    ('kea_api_user',      '',                           'Utilisateur Basic Auth Kea Control Agent (vide = pas d\'auth)'),
    ('kea_api_password',  '',                           'Mot de passe Basic Auth Kea Control Agent'),
    ('sync_server_url',   'http://localhost:8765/sync', 'URL de kea-sync-from-db.py (mode FreeBSD uniquement)'),
    ('sync_token',        '',                           'Token secret pour kea-sync-from-db.py')
ON DUPLICATE KEY UPDATE setting_key = setting_key;

-- Demandes de réservation (formulaire public)
CREATE TABLE IF NOT EXISTS app_reservation_requests (
    id               INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    requester_name   VARCHAR(100) NOT NULL,
    requester_email  VARCHAR(150) NOT NULL,
    mac_address      VARCHAR(17)  NOT NULL,
    subnet_id        INT UNSIGNED NOT NULL COMMENT 'app_subnets.id',
    description      TEXT         NULL,
    status           ENUM('pending') NOT NULL DEFAULT 'pending',
    created_at       DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP,
    INDEX idx_created_at (created_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
