// Conexao com o MariaDB do servidor central (porta 3307, banco "solusysmobile",
// separado do MySQL do Genius de cada cliente) + criacao das tabelas se nao existirem.
require("dotenv").config();
const mysql = require("mysql2/promise");

const pool = mysql.createPool({
  host: process.env.DB_HOST,
  port: process.env.DB_PORT,
  user: process.env.DB_USER,
  password: process.env.DB_PASSWORD,
  database: process.env.DB_NAME,
  waitForConnections: true,
  connectionLimit: 10,
  queueLimit: 0,
});

async function initDb() {
  const conn = await pool.getConnection();
  try {
    // Um cliente = uma instalacao do Genius/Solusys. "codigo" e o mesmo codigo
    // sequencial que a licenca ja usa. "slug" e a parte da URL (/nomedocliente)
    // que so o admin cria - nunca digitado pelo usuario final.
    await conn.query(`
      CREATE TABLE IF NOT EXISTS clientes (
        id INT AUTO_INCREMENT PRIMARY KEY,
        codigo VARCHAR(20) NOT NULL UNIQUE,
        slug VARCHAR(60) NOT NULL UNIQUE,
        nome VARCHAR(120) NOT NULL,
        liberado TINYINT(1) NOT NULL DEFAULT 0,
        token_agente VARCHAR(64) NOT NULL,
        criado_em DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
        atualizado_em DATETIME NULL
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
    `);

    // Empresas de cada cliente -- um cliente (uma instalacao/licenca) pode ter
    // MAIS DE UMA empresa no mesmo banco Genius (ex: rede com varias lojas).
    // Descoberto via tabela "filiais" do Genius; se o cliente so tem 1 empresa
    // (filiais vazia, caso mais comum), o agente manda so id_empresa=1 mesmo assim.
    await conn.query(`
      CREATE TABLE IF NOT EXISTS empresas (
        id INT AUTO_INCREMENT PRIMARY KEY,
        cliente_id INT NOT NULL,
        id_empresa INT NOT NULL,
        nome VARCHAR(120) NULL,
        UNIQUE KEY uq_cliente_empresa (cliente_id, id_empresa),
        FOREIGN KEY (cliente_id) REFERENCES clientes(id) ON DELETE CASCADE
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
    `);

    // Login/senha sincronizados do Genius (tabela funcionarios, Login_fun/Senha_fun).
    // senha_hash NUNCA guarda a senha em texto puro -- o agente local ja manda
    // hasheado (bcrypt), o servidor central nunca ve a senha original do Genius.
    // Chave unica inclui id_empresa: o MESMO login pode existir em empresas
    // diferentes do mesmo cliente, com senhas diferentes (confirmado que
    // acontece na pratica com clientes multi-empresa).
    await conn.query(`
      CREATE TABLE IF NOT EXISTS credenciais (
        id INT AUTO_INCREMENT PRIMARY KEY,
        cliente_id INT NOT NULL,
        login VARCHAR(20) NOT NULL,
        senha_hash VARCHAR(255) NOT NULL,
        nome_funcionario VARCHAR(60),
        id_empresa INT NOT NULL,
        UNIQUE KEY uq_cliente_login_empresa (cliente_id, login, id_empresa),
        FOREIGN KEY (cliente_id) REFERENCES clientes(id) ON DELETE CASCADE
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
    `);

    // Flag do botao "Sincronizar agora" -- o agente confere isso a cada poucos
    // segundos (poll leve) e dispara a sincronizacao completa quando ve pendente=1.
    await conn.query(`
      CREATE TABLE IF NOT EXISTS sync_pendente (
        cliente_id INT PRIMARY KEY,
        pendente TINYINT(1) NOT NULL DEFAULT 0,
        solicitado_em DATETIME NULL,
        FOREIGN KEY (cliente_id) REFERENCES clientes(id) ON DELETE CASCADE
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
    `);

    // Sessao de login do painel mobile (token simples em cookie, nao JWT --
    // mesmo padrao usado no Frota Trucks/VPMGourmet).
    await conn.query(`
      CREATE TABLE IF NOT EXISTS sessoes (
        token VARCHAR(64) PRIMARY KEY,
        cliente_id INT NOT NULL,
        login VARCHAR(20) NOT NULL,
        criado_em DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
        expira_em DATETIME NOT NULL,
        FOREIGN KEY (cliente_id) REFERENCES clientes(id) ON DELETE CASCADE
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
    `);

    console.log("Banco solusysmobile OK (tabelas conferidas/criadas).");
  } finally {
    conn.release();
  }
}

module.exports = { pool, initDb };
