SET NAMES utf8mb4;
SET time_zone = '+00:00';

CREATE TABLE IF NOT EXISTS funcionarios (
  id BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
  nome VARCHAR(120) NOT NULL,
  cpf VARCHAR(14) UNIQUE,
  email VARCHAR(160) UNIQUE,
  status ENUM('ativo','inativo') NOT NULL DEFAULT 'ativo',
  criado_em TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE IF NOT EXISTS dispositivos (
  id BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
  funcionario_id BIGINT UNSIGNED NULL,
  identificador VARCHAR(191) NOT NULL,
  apelido VARCHAR(120),
  ativo TINYINT(1) NOT NULL DEFAULT 1,
  criado_em TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  UNIQUE KEY uk_dispositivo_ident (identificador),
  KEY idx_disp_func (funcionario_id),
  CONSTRAINT fk_disp_func FOREIGN KEY (funcionario_id) REFERENCES funcionarios(id)
    ON DELETE SET NULL ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE IF NOT EXISTS locais (
  id BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
  nome VARCHAR(120) NOT NULL,
  lat DECIMAL(10,7),
  lng DECIMAL(10,7),
  raio_metros INT DEFAULT 100,
  criado_em TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE IF NOT EXISTS jornadas (
  id BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
  funcionario_id BIGINT UNSIGNED NOT NULL,
  data DATE NOT NULL,
  entrada_prevista TIME NULL,
  saida_prevista TIME NULL,
  observacao VARCHAR(255),
  UNIQUE KEY uk_jornada (funcionario_id, data),
  KEY idx_jornada_func (funcionario_id),
  CONSTRAINT fk_jornada_func FOREIGN KEY (funcionario_id) REFERENCES funcionarios(id)
    ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE IF NOT EXISTS batidas (
  id BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
  funcionario_id BIGINT UNSIGNED NOT NULL,
  dispositivo_id BIGINT UNSIGNED NULL,
  local_id BIGINT UNSIGNED NULL,
  tipo ENUM('entrada','intervalo_saida','intervalo_retorno','saida') NOT NULL,
  ocorrido_em_utc DATETIME NOT NULL,
  origem VARCHAR(40) DEFAULT 'app',
  meta JSON NULL,
  criado_em TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  KEY idx_batida_func_data (funcionario_id, ocorrido_em_utc),
  KEY idx_batida_tipo (tipo),
  CONSTRAINT fk_bat_func FOREIGN KEY (funcionario_id) REFERENCES funcionarios(id)
    ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT fk_bat_disp FOREIGN KEY (dispositivo_id) REFERENCES dispositivos(id)
    ON DELETE SET NULL ON UPDATE CASCADE,
  CONSTRAINT fk_bat_local FOREIGN KEY (local_id) REFERENCES locais(id)
    ON DELETE SET NULL ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE IF NOT EXISTS sessoes (
  id BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
  funcionario_id BIGINT UNSIGNED NOT NULL,
  token VARCHAR(191) NOT NULL,
  expira_em DATETIME NOT NULL,
  criado_em TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  UNIQUE KEY uk_token (token),
  KEY idx_sess_func (funcionario_id),
  CONSTRAINT fk_sess_func FOREIGN KEY (funcionario_id) REFERENCES funcionarios(id)
    ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE INDEX IF NOT EXISTS idx_batidas_data ON batidas (ocorrido_em_utc);
