-- ============================================================
-- NIS2 Agile — Migration 012: Sistema Inviti / Licenze
-- Inviti a tempo per provisioning automatico da e-commerce,
-- lg231 e altri sistemi Agile partner.
-- ============================================================

USE nis2_agile_db;

CREATE TABLE IF NOT EXISTS invites (
    id              INT UNSIGNED    NOT NULL AUTO_INCREMENT,

    -- Token (visibile al chiamante, formato: inv_XXXX...)
    token_prefix    VARCHAR(16)     NOT NULL,           -- es: inv_a1b2c3
    token_hash      VARCHAR(64)     NOT NULL UNIQUE,    -- SHA-256 del token completo

    -- Configurazione licenza
    plan            ENUM('essentials','professional','enterprise') NOT NULL DEFAULT 'professional',
    duration_months TINYINT UNSIGNED NOT NULL DEFAULT 12,
    label           VARCHAR(255)    NULL,               -- es: "lg231 Partner Q1 2026"
    notes           TEXT            NULL,

    -- Limiti utilizzo
    max_uses        TINYINT UNSIGNED NOT NULL DEFAULT 1,  -- 1 = one-shot, N = multi-use
    used_count      TINYINT UNSIGNED NOT NULL DEFAULT 0,

    -- Scadenza invito (indipendente dalla scadenza licenza)
    expires_at      DATETIME        NOT NULL,

    -- Canale di distribuzione
    channel         VARCHAR(64)     NULL,               -- 'lg231', 'ecommerce', 'direct', 'manual'
    issued_to       VARCHAR(255)    NULL,               -- email o nome destinatario
    issued_by       INT UNSIGNED    NULL,               -- user_id NIS2 admin che ha generato

    -- Utilizzo
    status          ENUM('pending','used','expired','revoked') NOT NULL DEFAULT 'pending',
    used_at         DATETIME        NULL,
    used_by_org_id  INT UNSIGNED    NULL,               -- org creata dall'invito
    used_by_ip      VARCHAR(45)     NULL,

    -- Restrizioni facoltative
    restrict_vat    VARCHAR(11)     NULL,               -- solo per questa P.IVA
    restrict_email  VARCHAR(255)    NULL,               -- solo per questo admin email

    -- Metadata extra (JSON)
    metadata        JSON            NULL,               -- dati extra (es: lg231 order_id)

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

    PRIMARY KEY (id),
    INDEX idx_invites_token_hash (token_hash),
    INDEX idx_invites_status     (status),
    INDEX idx_invites_channel    (channel),
    INDEX idx_invites_expires    (expires_at),
    INDEX idx_invites_org        (used_by_org_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

SELECT 'Migration 012 invites completata.' AS stato;
