-- ============================================================
-- AutoGestão Oficina — Schema MySQL
-- Versão: 1.0
-- ============================================================


-- ------------------------------------------------------------
-- Utilizadores (auth + perfis)
-- ------------------------------------------------------------
CREATE TABLE IF NOT EXISTS utilizadores (
  id           INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  nome         VARCHAR(120)  NOT NULL,
  email        VARCHAR(180)  NOT NULL UNIQUE,
  password     VARCHAR(255)  NOT NULL,          -- bcrypt hash
  perfil       ENUM('admin','mecanico','rececionista') NOT NULL DEFAULT 'mecanico',
  ativo        TINYINT(1)    NOT NULL DEFAULT 1,
  ultimo_login DATETIME      NULL,
  criado_em    DATETIME      NOT NULL DEFAULT CURRENT_TIMESTAMP,
  atualizado_em DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- Admin padrão (password: Admin@1234 — ALTERAR após primeiro login)
INSERT INTO utilizadores (nome, email, password, perfil) VALUES
('Administrador', 'admin@oficina.pt', '$2b$12$LQv3c1yqBwmVbPgDH3CFCO5qFJOQMbMqA7lBv7AW7UUAeNkWBkDBG', 'admin');

-- ------------------------------------------------------------
-- Clientes
-- ------------------------------------------------------------
CREATE TABLE IF NOT EXISTS clientes (
  id           INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  nome         VARCHAR(150)  NOT NULL,
  telefone     VARCHAR(30)   NULL,
  email        VARCHAR(180)  NULL,
  nif          VARCHAR(20)   NULL,
  morada       VARCHAR(255)  NULL,
  observacoes  TEXT          NULL,
  ativo        TINYINT(1)    NOT NULL DEFAULT 1,
  criado_por   INT UNSIGNED  NULL,
  criado_em    DATETIME      NOT NULL DEFAULT CURRENT_TIMESTAMP,
  atualizado_em DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  FOREIGN KEY (criado_por) REFERENCES utilizadores(id) ON DELETE SET NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ------------------------------------------------------------
-- Viaturas
-- ------------------------------------------------------------
CREATE TABLE IF NOT EXISTS viaturas (
  id           INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  cliente_id   INT UNSIGNED  NOT NULL,
  marca        VARCHAR(80)   NOT NULL,
  modelo       VARCHAR(80)   NOT NULL,
  ano          YEAR          NULL,
  matricula    VARCHAR(20)   NOT NULL,
  cor          VARCHAR(40)   NULL,
  km_atual     INT UNSIGNED  NOT NULL DEFAULT 0,
  vin          VARCHAR(50)   NULL,
  combustivel  ENUM('Gasolina','Diesel','Elétrico','Híbrido','GPL','Outro') NOT NULL DEFAULT 'Gasolina',
  observacoes  TEXT          NULL,
  ativo        TINYINT(1)    NOT NULL DEFAULT 1,
  criado_em    DATETIME      NOT NULL DEFAULT CURRENT_TIMESTAMP,
  atualizado_em DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  FOREIGN KEY (cliente_id) REFERENCES clientes(id) ON DELETE RESTRICT,
  INDEX idx_matricula (matricula),
  INDEX idx_cliente (cliente_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ------------------------------------------------------------
-- Documentos / Fotografias (viaturas)
-- ------------------------------------------------------------
CREATE TABLE IF NOT EXISTS documentos (
  id           INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  viatura_id   INT UNSIGNED  NOT NULL,
  nome         VARCHAR(255)  NOT NULL,
  ficheiro     VARCHAR(500)  NOT NULL,   -- path relativo em /uploads/
  tipo         VARCHAR(100)  NULL,       -- MIME type
  tamanho      INT UNSIGNED  NULL,       -- bytes
  descricao    VARCHAR(255)  NULL,
  criado_por   INT UNSIGNED  NULL,
  criado_em    DATETIME      NOT NULL DEFAULT CURRENT_TIMESTAMP,
  FOREIGN KEY (viatura_id) REFERENCES viaturas(id) ON DELETE CASCADE,
  FOREIGN KEY (criado_por) REFERENCES utilizadores(id) ON DELETE SET NULL,
  INDEX idx_viatura (viatura_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ------------------------------------------------------------
-- Agendamentos
-- ------------------------------------------------------------
CREATE TABLE IF NOT EXISTS agendamentos (
  id           INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  viatura_id   INT UNSIGNED  NULL,
  cliente_id   INT UNSIGNED  NOT NULL,
  titulo       VARCHAR(200)  NOT NULL,
  descricao    TEXT          NULL,
  data_inicio  DATETIME      NOT NULL,
  data_fim     DATETIME      NULL,
  dia_todo     TINYINT(1)    NOT NULL DEFAULT 0,
  status       ENUM('agendado','confirmado','concluido','cancelado') NOT NULL DEFAULT 'agendado',
  cor          VARCHAR(10)   NULL DEFAULT '#6366f1',  -- hex color para calendário
  mecanico_id  INT UNSIGNED  NULL,
  criado_por   INT UNSIGNED  NULL,
  criado_em    DATETIME      NOT NULL DEFAULT CURRENT_TIMESTAMP,
  atualizado_em DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  FOREIGN KEY (viatura_id)  REFERENCES viaturas(id)    ON DELETE SET NULL,
  FOREIGN KEY (cliente_id)  REFERENCES clientes(id)    ON DELETE CASCADE,
  FOREIGN KEY (mecanico_id) REFERENCES utilizadores(id) ON DELETE SET NULL,
  FOREIGN KEY (criado_por)  REFERENCES utilizadores(id) ON DELETE SET NULL,
  INDEX idx_data (data_inicio),
  INDEX idx_cliente (cliente_id),
  INDEX idx_mecanico (mecanico_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ------------------------------------------------------------
-- Manutenções
-- ------------------------------------------------------------
CREATE TABLE IF NOT EXISTS manutencoes (
  id            INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  viatura_id    INT UNSIGNED  NOT NULL,
  agendamento_id INT UNSIGNED NULL,          -- ligado ao agendamento se veio da agenda
  tipo          VARCHAR(150)  NOT NULL,
  data          DATE          NOT NULL,
  km            INT UNSIGNED  NOT NULL DEFAULT 0,
  prox_data     DATE          NULL,
  prox_km       INT UNSIGNED  NULL,
  observacoes   TEXT          NULL,
  status        ENUM('agendada','concluida','cancelada') NOT NULL DEFAULT 'agendada',
  mecanico_id   INT UNSIGNED  NULL,
  criado_por    INT UNSIGNED  NULL,
  criado_em     DATETIME      NOT NULL DEFAULT CURRENT_TIMESTAMP,
  atualizado_em DATETIME      NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  FOREIGN KEY (viatura_id)     REFERENCES viaturas(id)      ON DELETE RESTRICT,
  FOREIGN KEY (agendamento_id) REFERENCES agendamentos(id)  ON DELETE SET NULL,
  FOREIGN KEY (mecanico_id)    REFERENCES utilizadores(id)  ON DELETE SET NULL,
  FOREIGN KEY (criado_por)     REFERENCES utilizadores(id)  ON DELETE SET NULL,
  INDEX idx_viatura (viatura_id),
  INDEX idx_data (data)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ------------------------------------------------------------
-- Orçamentos
-- ------------------------------------------------------------
CREATE TABLE IF NOT EXISTS orcamentos (
  id           INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  numero       VARCHAR(30)   NOT NULL UNIQUE,  -- ORC-2025-001
  viatura_id   INT UNSIGNED  NULL,
  cliente_id   INT UNSIGNED  NOT NULL,
  data         DATE          NOT NULL,
  validade     DATE          NULL,
  iva          DECIMAL(5,2)  NOT NULL DEFAULT 17.00,
  status       ENUM('pendente','aprovado','recusado','faturado') NOT NULL DEFAULT 'pendente',
  notas        TEXT          NULL,
  criado_por   INT UNSIGNED  NULL,
  criado_em    DATETIME      NOT NULL DEFAULT CURRENT_TIMESTAMP,
  atualizado_em DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  FOREIGN KEY (viatura_id)  REFERENCES viaturas(id)     ON DELETE SET NULL,
  FOREIGN KEY (cliente_id)  REFERENCES clientes(id)     ON DELETE RESTRICT,
  FOREIGN KEY (criado_por)  REFERENCES utilizadores(id) ON DELETE SET NULL,
  INDEX idx_cliente (cliente_id),
  INDEX idx_numero (numero)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ------------------------------------------------------------
-- Linhas de Orçamento
-- ------------------------------------------------------------
CREATE TABLE IF NOT EXISTS orcamento_items (
  id            INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  orcamento_id  INT UNSIGNED    NOT NULL,
  descricao     VARCHAR(255)    NOT NULL,
  quantidade    DECIMAL(10,2)   NOT NULL DEFAULT 1,
  preco_unit    DECIMAL(10,2)   NOT NULL DEFAULT 0,
  ordem         TINYINT UNSIGNED NOT NULL DEFAULT 0,
  FOREIGN KEY (orcamento_id) REFERENCES orcamentos(id) ON DELETE CASCADE,
  INDEX idx_orcamento (orcamento_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

-- ------------------------------------------------------------
-- Refresh tokens (auth)
-- ------------------------------------------------------------
CREATE TABLE IF NOT EXISTS refresh_tokens (
  id           INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  utilizador_id INT UNSIGNED NOT NULL,
  token        VARCHAR(500) NOT NULL UNIQUE,
  expira_em    DATETIME     NOT NULL,
  criado_em    DATETIME     NOT NULL DEFAULT CURRENT_TIMESTAMP,
  FOREIGN KEY (utilizador_id) REFERENCES utilizadores(id) ON DELETE CASCADE,
  INDEX idx_token (token(255))
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

