-- ============================================================
-- Schema tabelle – Gestione Rimborsi Spese Aziendali
-- ============================================================

USE provapratica;

-- ------------------------------------------------------------
-- Tabella UTENTI
-- Ruoli: DIPENDENTE | RESPONSABILE_AMMINISTRATIVO
-- ------------------------------------------------------------
CREATE TABLE IF NOT EXISTS utenti (
  utente_id       INT UNSIGNED      NOT NULL AUTO_INCREMENT,
  nome            VARCHAR(100)      NOT NULL,
  cognome         VARCHAR(100)      NOT NULL,
  email           VARCHAR(255)      NOT NULL,
  password_hash   VARCHAR(255)      NOT NULL COMMENT 'Password salvata come hash (es. bcrypt)',
  ruolo           ENUM('DIPENDENTE', 'RESPONSABILE_AMMINISTRATIVO')
                                    NOT NULL DEFAULT 'DIPENDENTE',
  created_at      DATETIME          NOT NULL DEFAULT CURRENT_TIMESTAMP,
  updated_at      DATETIME          NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,

  PRIMARY KEY (utente_id),
  UNIQUE KEY uk_utenti_email (email),
  KEY idx_utenti_ruolo (ruolo)
) ENGINE=InnoDB
  DEFAULT CHARSET=utf8mb4
  COLLATE=utf8mb4_unicode_ci;

-- ------------------------------------------------------------
-- Tabella CATEGORIE_SPESA
-- ------------------------------------------------------------
CREATE TABLE IF NOT EXISTS categorie_spesa (
  categoria_id    INT UNSIGNED      NOT NULL AUTO_INCREMENT,
  descrizione     VARCHAR(150)      NOT NULL,

  PRIMARY KEY (categoria_id),
  UNIQUE KEY uk_categorie_spesa_descrizione (descrizione)
) ENGINE=InnoDB
  DEFAULT CHARSET=utf8mb4
  COLLATE=utf8mb4_unicode_ci;

-- ------------------------------------------------------------
-- Tabella RICHIESTE_RIMBORSO
-- Stati: IN_ATTESA | APPROVATA | RIFIUTATA | LIQUIDATA
-- ------------------------------------------------------------
CREATE TABLE IF NOT EXISTS richieste_rimborso (
  richiesta_id                INT UNSIGNED      NOT NULL AUTO_INCREMENT,
  data_inserimento            DATETIME          NOT NULL DEFAULT CURRENT_TIMESTAMP,
  data_spesa                  DATE              NOT NULL,
  categoria_id                INT UNSIGNED      NOT NULL,
  importo                     DECIMAL(10, 2)    NOT NULL,
  descrizione                 VARCHAR(500)      NOT NULL,
  riferimento_giustificativo  VARCHAR(255)      NULL,
  stato                       ENUM('IN_ATTESA', 'APPROVATA', 'RIFIUTATA', 'LIQUIDATA')
                                                NOT NULL DEFAULT 'IN_ATTESA',
  dipendente_id               INT UNSIGNED      NOT NULL,
  data_valutazione            DATETIME          NULL,
  responsabile_valutazione_id INT UNSIGNED      NULL,
  motivazione_rifiuto         VARCHAR(500)      NULL,
  data_liquidazione           DATETIME          NULL,

  PRIMARY KEY (richiesta_id),

  CONSTRAINT fk_richieste_categoria
    FOREIGN KEY (categoria_id)
    REFERENCES categorie_spesa (categoria_id)
    ON UPDATE CASCADE
    ON DELETE RESTRICT,

  CONSTRAINT fk_richieste_dipendente
    FOREIGN KEY (dipendente_id)
    REFERENCES utenti (utente_id)
    ON UPDATE CASCADE
    ON DELETE RESTRICT,

  CONSTRAINT fk_richieste_responsabile
    FOREIGN KEY (responsabile_valutazione_id)
    REFERENCES utenti (utente_id)
    ON UPDATE CASCADE
    ON DELETE SET NULL,

  CONSTRAINT chk_richieste_importo_positivo
    CHECK (importo > 0),

  CONSTRAINT chk_richieste_descrizione_non_vuota
    CHECK (CHAR_LENGTH(TRIM(descrizione)) > 0),

  CONSTRAINT chk_richieste_data_valutazione
    CHECK (
      data_valutazione IS NULL
      OR data_valutazione >= data_inserimento
    ),

  CONSTRAINT chk_richieste_data_liquidazione
    CHECK (
      data_liquidazione IS NULL
      OR data_valutazione IS NULL
      OR data_liquidazione >= data_valutazione
    ),

  CONSTRAINT chk_richieste_rifiuto_motivazione
    CHECK (
      stato <> 'RIFIUTATA'
      OR motivazione_rifiuto IS NOT NULL
    ),

  KEY idx_richieste_stato (stato),
  KEY idx_richieste_data_spesa (data_spesa),
  KEY idx_richieste_dipendente (dipendente_id),
  KEY idx_richieste_categoria (categoria_id),
  KEY idx_richieste_data_inserimento (data_inserimento)
) ENGINE=InnoDB
  DEFAULT CHARSET=utf8mb4
  COLLATE=utf8mb4_unicode_ci;
