-- ============================================================
-- Schema tabelle – Gestione Corrieri 
-- Allineato alle API: /utenti, /clienti, /cd campi, /prenotazioni
-- ============================================================

USE corrieri;

-- ------------------------------------------------------------
-- Tabella operatore  (API: GET/POST/PUT/DELETE /operatori)
-- ------------------------------------------------------------
CREATE TABLE IF NOT EXISTS operatore (
  OperatoreID   INT UNSIGNED  NOT NULL AUTO_INCREMENT,
  Nome          VARCHAR(100)  NOT NULL,
  Cognome       VARCHAR(100)  NOT NULL,
  Email         VARCHAR(255)  NOT NULL,
  PasswordHash  VARCHAR(255)  NOT NULL COMMENT 'Password salvata come hash (es. bcrypt)',
  Admin         BOOLEAN       NOT NULL DEFAULT FALSE,
  created_at    DATETIME      NOT NULL DEFAULT CURRENT_TIMESTAMP,
  updated_at    DATETIME      NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,

  PRIMARY KEY (OperatoreID),
  UNIQUE KEY uk_operatore_email (Email)
) ENGINE=InnoDB
  DEFAULT CHARSET=utf8mb4
  COLLATE=utf8mb4_unicode_ci;


-- ------------------------------------------------------------
-- Tabella cliente  (API: GET/POST/PUT/DELETE /clienti)
-- ------------------------------------------------------------
CREATE TABLE IF NOT EXISTS cliente (
  ClienteID   INT UNSIGNED  NOT NULL AUTO_INCREMENT,
  Nome        VARCHAR(100)  NOT NULL,
  Cognome     VARCHAR(100)  NOT NULL,
  Telefono    VARCHAR(30)   NOT NULL,
  Email       VARCHAR(255)  NOT NULL,
  Note        TEXT,
  created_at  DATETIME      NOT NULL DEFAULT CURRENT_TIMESTAMP,
  updated_at  DATETIME      NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,

  PRIMARY KEY (ClienteID),
  UNIQUE KEY uk_cliente_email (Email)
) ENGINE=InnoDB
  DEFAULT CHARSET=utf8mb4
  COLLATE=utf8mb4_unicode_ci;


-- -------------------------------------------------------------
-- Tabella camposportivo  (API: GET/POST/PUT/DELETE /campi)
-- -------------------------------------------------------------
CREATE TABLE IF NOT EXISTS camposportivo (
  CampoID      INT UNSIGNED                        NOT NULL AUTO_INCREMENT,
  Nome         VARCHAR(100)                        NOT NULL,
  Tipo         ENUM('tennis', 'padel', 'calcetto') NOT NULL,
  Coperto      BOOLEAN                             NOT NULL DEFAULT FALSE,
  PrezzoOrario DECIMAL(10, 2)                      NOT NULL,
  Attivo       BOOLEAN                             NOT NULL DEFAULT TRUE,

  PRIMARY KEY (CampoID),
  UNIQUE KEY uk_camposportivo_nome (Nome)
) ENGINE=InnoDB
  DEFAULT CHARSET=utf8mb4
  COLLATE=utf8mb4_unicode_ci;


-- ----------------------------------------------------------------
-- Tabella prenotazione  (API: GET/POST/PUT/DELETE /prenotazioni)
-- ----------------------------------------------------------------
CREATE TABLE IF NOT EXISTS prenotazione (
  PrenotazioneID     INT UNSIGNED                                            NOT NULL AUTO_INCREMENT,
  Data               DATE                                                    NOT NULL,
  OraInizio          TIME                                                    NOT NULL,
  OraFine            TIME                                                    NOT NULL,
  Stato              ENUM('prenotata', 'confermata', 'annullata', 'completata') NOT NULL DEFAULT 'prenotata',
  CodicePrenotazione VARCHAR(8)                                              NOT NULL,
  ClienteID          INT UNSIGNED                                            NOT NULL,
  CampoID            INT UNSIGNED                                            NOT NULL,

  PRIMARY KEY (PrenotazioneID),
  UNIQUE KEY uk_prenotazione_codice (CodicePrenotazione),
  KEY idx_prenotazione_campo_data (CampoID, Data),

  CONSTRAINT ck_prenotazione_orario_valido
    CHECK (OraFine > OraInizio),

  CONSTRAINT fk_prenotazione_cliente
    FOREIGN KEY (ClienteID)
    REFERENCES cliente (ClienteID)
    ON UPDATE CASCADE
    ON DELETE RESTRICT,

  CONSTRAINT fk_prenotazione_campo
    FOREIGN KEY (CampoID)
    REFERENCES camposportivo (CampoID)
    ON UPDATE CASCADE
    ON DELETE RESTRICT
) ENGINE=InnoDB
  DEFAULT CHARSET=utf8mb4
  COLLATE=utf8mb4_unicode_ci;


-- ----------------------------------------------------------------
-- Trigger anti-sovrapposizione (stesso campo, stessa data)
-- Le prenotazioni annullate non occupano lo slot.
-- ----------------------------------------------------------------
DROP TRIGGER IF EXISTS trg_prenotazione_no_overlap_insert;
DROP TRIGGER IF EXISTS trg_prenotazione_no_overlap_update;

DELIMITER $$

CREATE TRIGGER trg_prenotazione_no_overlap_insert
BEFORE INSERT ON prenotazione
FOR EACH ROW
BEGIN
  IF NEW.Stato <> 'annullata' AND EXISTS (
    SELECT 1
    FROM prenotazione AS p
    WHERE p.CampoID = NEW.CampoID
      AND p.Data = NEW.Data
      AND p.Stato <> 'annullata'
      AND NEW.OraInizio < p.OraFine
      AND p.OraInizio < NEW.OraFine
  ) THEN
    SIGNAL SQLSTATE '45000'
      SET MESSAGE_TEXT = 'Sovrapposizione: esiste già una prenotazione attiva in questo orario per il campo selezionato';
  END IF;
END$$

CREATE TRIGGER trg_prenotazione_no_overlap_update
BEFORE UPDATE ON prenotazione
FOR EACH ROW
BEGIN
  IF NEW.Stato <> 'annullata' AND EXISTS (
    SELECT 1
    FROM prenotazione AS p
    WHERE p.PrenotazioneID <> NEW.PrenotazioneID
      AND p.CampoID = NEW.CampoID
      AND p.Data = NEW.Data
      AND p.Stato <> 'annullata'
      AND NEW.OraInizio < p.OraFine
      AND p.OraInizio < NEW.OraFine
  ) THEN
    SIGNAL SQLSTATE '45000'
      SET MESSAGE_TEXT = 'Sovrapposizione: esiste già una prenotazione attiva in questo orario per il campo selezionato';
  END IF;
END$$

DELIMITER ;
