-- ============================================================
-- Script : meta_lead_db.sql
-- Base   : meta_lead_db
--
-- Objectif :
--   Créer une base intermédiaire permettant de stocker les
--   formulaires et leads Meta Lead Gen avant leur injection
--   dans OscarCRM.
--
-- Remarques techniques :
--   - Les IDs Meta sont stockés en VARCHAR car ils sont fournis
--     sous forme de chaînes numériques.
--   - Les données brutes Meta sont conservées en JSON pour garder
--     une traçabilité complète.
--   - Les colonnes indexées sont limitées pour rester compatibles
--     avec les anciennes limites MySQL/InnoDB en utf8mb4.
-- ============================================================

DROP DATABASE IF EXISTS meta_lead_db;

CREATE DATABASE meta_lead_db
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;

USE meta_lead_db;

-- ============================================================
-- Table : meta_forms
--
-- Rôle :
--   Stocke les formulaires Lead Gen récupérés depuis Meta.
--   Chaque formulaire peut être lié à un campus ou à une campagne.
-- ============================================================

CREATE TABLE meta_forms (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,

    meta_form_id VARCHAR(64) NOT NULL,
    page_id VARCHAR(64) NOT NULL,

    name VARCHAR(255) NOT NULL,
    status VARCHAR(50) NOT NULL,
    locale VARCHAR(20) NULL,

    campus VARCHAR(100) NULL,

    raw_payload JSON NULL,

    created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    updated_at DATETIME NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,

    CONSTRAINT uq_meta_forms_meta_form_id
        UNIQUE (meta_form_id),

    INDEX idx_meta_forms_status (status),
    INDEX idx_meta_forms_campus (campus)
) ENGINE=InnoDB
  DEFAULT CHARSET=utf8mb4
  COLLATE=utf8mb4_unicode_ci
  COMMENT='Formulaires Meta Lead Gen récupérés depuis l API Meta.';


-- ============================================================
-- Table : meta_form_questions
--
-- Rôle :
--   Stocke les questions/champs associés à chaque formulaire Meta.
--   Cette table permet de connaître la structure exacte des
--   formulaires utilisés pour générer les leads.
--
-- Note :
--   field_key est limité à 100 caractères afin d éviter les erreurs
--   d index avec utf8mb4 sur certaines versions MySQL/InnoDB.
-- ============================================================

CREATE TABLE meta_form_questions (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,

    meta_form_id VARCHAR(64) NOT NULL,

    question_id VARCHAR(64) NULL,
    field_key VARCHAR(100) NOT NULL,
    label VARCHAR(255) NULL,
    question_type VARCHAR(100) NULL,

    question_options JSON NULL,
    raw_payload JSON NULL,

    created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    updated_at DATETIME NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,

    CONSTRAINT uq_meta_form_questions_form_field
        UNIQUE (meta_form_id, field_key),

    CONSTRAINT fk_meta_form_questions_form
        FOREIGN KEY (meta_form_id)
        REFERENCES meta_forms(meta_form_id)
        ON UPDATE CASCADE
        ON DELETE CASCADE,

    INDEX idx_meta_form_questions_form (meta_form_id)
) ENGINE=InnoDB
  DEFAULT CHARSET=utf8mb4
  COLLATE=utf8mb4_unicode_ci
  COMMENT='Questions et champs des formulaires Meta Lead Gen.';


-- ============================================================
-- Table : meta_leads
--
-- Rôle :
--   Stocke les leads récupérés depuis les formulaires Meta.
--   Les colonnes principales reprennent les champs du formulaire
--   Meta et correspondent au format attendu pour OscarCRM.
--
-- Statuts :
--   RECEIVED      : lead récupéré depuis Meta
--   READY_TO_SEND : lead prêt à être envoyé vers OscarCRM
--   SENT          : lead envoyé avec succès vers OscarCRM
--   ERROR         : erreur pendant le traitement ou l envoi
--   INVALID       : données obligatoires manquantes ou invalides
-- ============================================================

CREATE TABLE meta_leads (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,

    meta_lead_id VARCHAR(64) NOT NULL,
    meta_form_id VARCHAR(64) NOT NULL,

    meta_ad_id VARCHAR(64) NULL,
    meta_campaign_id VARCHAR(64) NULL,

    created_time DATETIME NULL,

    je_suis VARCHAR(255) NULL,
    nom VARCHAR(255) NULL,
    first_name VARCHAR(255) NULL,
    adresse_email VARCHAR(191) NULL,
    phone_number VARCHAR(50) NULL,
    city VARCHAR(255) NULL,

    source VARCHAR(100) NOT NULL DEFAULT 'META_LEAD_GEN',
    campus VARCHAR(100) NULL,

    raw_payload JSON NOT NULL,
    oscar_payload JSON NULL,
    oscar_response JSON NULL,

    status VARCHAR(50) NOT NULL DEFAULT 'RECEIVED',

    error_message TEXT NULL,
    synced_at DATETIME NULL,

    created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    updated_at DATETIME NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,

    CONSTRAINT uq_meta_leads_meta_lead_id
        UNIQUE (meta_lead_id),

    CONSTRAINT fk_meta_leads_form
        FOREIGN KEY (meta_form_id)
        REFERENCES meta_forms(meta_form_id)
        ON UPDATE CASCADE
        ON DELETE RESTRICT,

    CONSTRAINT chk_meta_leads_status
        CHECK (status IN ('RECEIVED', 'READY_TO_SEND', 'SENT', 'ERROR', 'INVALID')),

    INDEX idx_meta_leads_status (status),
    INDEX idx_meta_leads_meta_form_id (meta_form_id),
    INDEX idx_meta_leads_created_time (created_time),
    INDEX idx_meta_leads_adresse_email (adresse_email),
    INDEX idx_meta_leads_synced_at (synced_at)
) ENGINE=InnoDB
  DEFAULT CHARSET=utf8mb4
  COLLATE=utf8mb4_unicode_ci
  COMMENT='Leads Meta Lead Gen stockés avant injection vers OscarCRM.';


-- ============================================================
-- Table : oscar_sync_logs
--
-- Rôle :
--   Trace chaque tentative d injection d un lead vers OscarCRM.
--   Cette table permet de conserver l historique des succès,
--   erreurs et réponses API sans écraser les données du lead.
--
-- Statuts :
--   SENT    : injection réussie
--   ERROR   : erreur lors de l injection
--   INVALID : payload non valide pour OscarCRM
-- ============================================================

CREATE TABLE oscar_sync_logs (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,

    lead_id BIGINT UNSIGNED NOT NULL,

    oscar_payload JSON NOT NULL,
    oscar_response JSON NULL,

    status VARCHAR(50) NOT NULL,
    error_message TEXT NULL,

    attempted_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,

    CONSTRAINT fk_oscar_sync_logs_lead
        FOREIGN KEY (lead_id)
        REFERENCES meta_leads(id)
        ON UPDATE CASCADE
        ON DELETE CASCADE,

    CONSTRAINT chk_oscar_sync_logs_status
        CHECK (status IN ('SENT', 'ERROR', 'INVALID')),

    INDEX idx_oscar_sync_logs_lead_id (lead_id),
    INDEX idx_oscar_sync_logs_status (status),
    INDEX idx_oscar_sync_logs_attempted_at (attempted_at)
) ENGINE=InnoDB
  DEFAULT CHARSET=utf8mb4
  COLLATE=utf8mb4_unicode_ci
  COMMENT='Historique des tentatives d injection des leads vers OscarCRM.';