-- ============================================================
--  Agent comptable WhatsApp - schema MySQL
--  Montants stockes en CENTIMES (BIGINT) : zero erreur d'arrondi.
-- ============================================================

SET NAMES utf8mb4;

CREATE TABLE IF NOT EXISTS societes (
  id              INT AUTO_INCREMENT PRIMARY KEY,
  nom             VARCHAR(190) NOT NULL,
  ice             VARCHAR(20),
  identifiant_fiscal VARCHAR(20),
  rc              VARCHAR(30),
  tva_regime      ENUM('mensuel','trimestriel') NOT NULL DEFAULT 'mensuel',
  exercice_debut  CHAR(5) NOT NULL DEFAULT '01-01',
  actif           TINYINT(1) NOT NULL DEFAULT 1,
  cree_le         DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Numeros WhatsApp autorises, rattaches a une societe
CREATE TABLE IF NOT EXISTS utilisateurs (
  id          INT AUTO_INCREMENT PRIMARY KEY,
  societe_id  INT NOT NULL,
  telephone   VARCHAR(20) NOT NULL UNIQUE,
  nom         VARCHAR(120),
  role        ENUM('admin','saisie','lecture') NOT NULL DEFAULT 'saisie',
  actif       TINYINT(1) NOT NULL DEFAULT 1,
  cree_le     DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  FOREIGN KEY (societe_id) REFERENCES societes(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Tiers (fournisseurs / clients) : memorise les habitudes de categorisation
CREATE TABLE IF NOT EXISTS tiers (
  id            INT AUTO_INCREMENT PRIMARY KEY,
  societe_id    INT NOT NULL,
  nom           VARCHAR(190) NOT NULL,
  nom_normalise VARCHAR(190) NOT NULL,
  type          ENUM('fournisseur','client','mixte') NOT NULL DEFAULT 'fournisseur',
  ice           VARCHAR(20),
  identifiant_fiscal VARCHAR(20),
  categorie_defaut VARCHAR(60),
  compte_defaut VARCHAR(10),
  nb_factures   INT NOT NULL DEFAULT 0,
  cree_le       DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  UNIQUE KEY uq_tiers (societe_id, nom_normalise),
  KEY idx_tiers_ice (ice),
  FOREIGN KEY (societe_id) REFERENCES societes(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Factures recues par WhatsApp
CREATE TABLE IF NOT EXISTS factures (
  id              INT AUTO_INCREMENT PRIMARY KEY,
  societe_id      INT NOT NULL,
  utilisateur_id  INT,
  sens            ENUM('achat','vente') NOT NULL DEFAULT 'achat',
  statut          ENUM('recue','extraite','attente_validation','validee','rejetee','erreur')
                  NOT NULL DEFAULT 'recue',
  date_facture    DATE,
  date_echeance   DATE,
  numero          VARCHAR(80),
  tiers_id        INT,
  tiers_nom       VARCHAR(190),
  tiers_ice       VARCHAR(20),
  objet           VARCHAR(255),
  categorie       VARCHAR(60),
  compte_principal VARCHAR(10),
  mode_paiement   VARCHAR(20) DEFAULT 'credit',
  taux_tva        DECIMAL(5,2),
  montant_ht      BIGINT NOT NULL DEFAULT 0,
  montant_tva     BIGINT NOT NULL DEFAULT 0,
  montant_ttc     BIGINT NOT NULL DEFAULT 0,
  tva_recuperable TINYINT(1) NOT NULL DEFAULT 1,
  immobilisation  TINYINT(1) NOT NULL DEFAULT 0,
  payee           TINYINT(1) NOT NULL DEFAULT 0,
  date_paiement   DATE,
  -- piece justificative
  fichier_path    VARCHAR(255),
  fichier_mime    VARCHAR(80),
  fichier_hash    CHAR(64),
  wa_message_id   VARCHAR(120),
  -- traces
  extraction_json JSON,
  confiance       DECIMAL(4,3),
  avertissements  TEXT,
  erreur          TEXT,
  cree_le         DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  maj_le          DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  UNIQUE KEY uq_hash (societe_id, fichier_hash),
  UNIQUE KEY uq_wa_msg (wa_message_id),
  KEY idx_periode (societe_id, date_facture),
  KEY idx_statut (societe_id, statut),
  KEY idx_impaye (societe_id, payee, date_echeance),
  FOREIGN KEY (societe_id) REFERENCES societes(id) ON DELETE CASCADE,
  FOREIGN KEY (tiers_id)   REFERENCES tiers(id)    ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Detection des doublons de numero de facture par fournisseur
CREATE TABLE IF NOT EXISTS ecritures (
  id            INT AUTO_INCREMENT PRIMARY KEY,
  societe_id    INT NOT NULL,
  facture_id    INT,
  journal       CHAR(2) NOT NULL DEFAULT 'AC',
  date_ecriture DATE NOT NULL,
  numero_piece  VARCHAR(80),
  libelle       VARCHAR(255) NOT NULL,
  total_debit   BIGINT NOT NULL,
  total_credit  BIGINT NOT NULL,
  exercice      SMALLINT NOT NULL,
  validee       TINYINT(1) NOT NULL DEFAULT 1,
  cree_le       DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  KEY idx_ec_periode (societe_id, date_ecriture),
  KEY idx_ec_journal (societe_id, journal, date_ecriture),
  FOREIGN KEY (societe_id) REFERENCES societes(id) ON DELETE CASCADE,
  FOREIGN KEY (facture_id) REFERENCES factures(id) ON DELETE SET NULL,
  CONSTRAINT chk_equilibre CHECK (total_debit = total_credit)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE IF NOT EXISTS ecriture_lignes (
  id            INT AUTO_INCREMENT PRIMARY KEY,
  ecriture_id   INT NOT NULL,
  societe_id    INT NOT NULL,
  compte        VARCHAR(10) NOT NULL,
  libelle       VARCHAR(255),
  debit         BIGINT NOT NULL DEFAULT 0,
  credit        BIGINT NOT NULL DEFAULT 0,
  ordre         TINYINT NOT NULL DEFAULT 0,
  KEY idx_ligne_compte (societe_id, compte),
  FOREIGN KEY (ecriture_id) REFERENCES ecritures(id) ON DELETE CASCADE,
  CONSTRAINT chk_sens CHECK (debit = 0 OR credit = 0)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Etat de la conversation WhatsApp (validation en attente, corrections)
CREATE TABLE IF NOT EXISTS sessions_wa (
  telephone   VARCHAR(20) PRIMARY KEY,
  societe_id  INT NOT NULL,
  etat        VARCHAR(40) NOT NULL DEFAULT 'idle',
  facture_id  INT,
  contexte    JSON,
  maj_le      DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Declarations TVA generees
CREATE TABLE IF NOT EXISTS declarations_tva (
  id              INT AUTO_INCREMENT PRIMARY KEY,
  societe_id      INT NOT NULL,
  periode_type    ENUM('mensuel','trimestriel') NOT NULL,
  annee           SMALLINT NOT NULL,
  periode         TINYINT NOT NULL,        -- 1..12 (mensuel) ou 1..4 (trimestriel)
  date_debut      DATE NOT NULL,
  date_fin        DATE NOT NULL,
  tva_collectee   BIGINT NOT NULL DEFAULT 0,
  tva_deductible_charges BIGINT NOT NULL DEFAULT 0,
  tva_deductible_immo    BIGINT NOT NULL DEFAULT 0,
  credit_anterieur BIGINT NOT NULL DEFAULT 0,
  tva_due         BIGINT NOT NULL DEFAULT 0,
  credit_reporte  BIGINT NOT NULL DEFAULT 0,
  date_limite     DATE,
  statut          ENUM('brouillon','deposee') NOT NULL DEFAULT 'brouillon',
  detail_json     JSON,
  cree_le         DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  UNIQUE KEY uq_decl (societe_id, annee, periode_type, periode),
  FOREIGN KEY (societe_id) REFERENCES societes(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Journal technique (audit)
CREATE TABLE IF NOT EXISTS journal_evenements (
  id          INT AUTO_INCREMENT PRIMARY KEY,
  societe_id  INT,
  telephone   VARCHAR(20),
  type        VARCHAR(40) NOT NULL,
  reference   VARCHAR(120),
  message     TEXT,
  cree_le     DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  KEY idx_evt (societe_id, cree_le)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
