/**
 * DocuAgro - Serviço de Autenticação JWT
 * Gerencia criação de usuários, login e verificação de tokens
 */

const bcrypt = require('bcryptjs');
const jwt = require('jsonwebtoken');
const { v4: uuidv4 } = require('uuid');
const Database = require('better-sqlite3');
const path = require('path');

const JWT_SECRET = process.env.JWT_SECRET || 'docuagro-jwt-secret-2026-production';
const JWT_EXPIRATION = '24h';

// Conecta ao banco (mesmo caminho do database.js)
const dbPath = process.env.DB_PATH || path.join(__dirname, '..', '..', 'data', 'docuagro.db');

function getDb() {
  const db = new Database(dbPath);
  db.pragma('journal_mode = WAL');
  db.pragma('foreign_keys = ON');
  return db;
}

/**
 * Cria um novo usuário no sistema
 */
async function criarUsuario({ username, senha, nome, role = 'admin', cooperativa_id = 'coop_001' }) {
  const db = getDb();
  try {
    // Verifica se username já existe
    const existente = db.prepare('SELECT id FROM usuarios WHERE username = ?').get(username);
    if (existente) {
      throw new Error('Username já existe');
    }

    const id = uuidv4();
    const senha_hash = await bcrypt.hash(senha, 10);

    db.prepare(`
      INSERT INTO usuarios (id, cooperativa_id, username, senha_hash, nome, role)
      VALUES (?, ?, ?, ?, ?, ?)
    `).run(id, cooperativa_id, username, senha_hash, nome || username, role);

    return {
      id,
      username,
      nome: nome || username,
      role,
      cooperativa_id
    };
  } finally {
    db.close();
  }
}

/**
 * Autentica um usuário com username e senha
 * Retorna o token JWT e dados do usuário
 */
async function autenticarUsuario(username, senha) {
  const db = getDb();
  try {
    const usuario = db.prepare('SELECT * FROM usuarios WHERE username = ?').get(username);

    if (!usuario) {
      throw new Error('Credenciais inválidas');
    }

    const senhaValida = await bcrypt.compare(senha, usuario.senha_hash);
    if (!senhaValida) {
      throw new Error('Credenciais inválidas');
    }

    // Gera token JWT
    const payload = {
      id: usuario.id,
      username: usuario.username,
      nome: usuario.nome,
      role: usuario.role,
      cooperativa_id: usuario.cooperativa_id
    };

    const token = jwt.sign(payload, JWT_SECRET, { expiresIn: JWT_EXPIRATION });

    return {
      token,
      usuario: payload
    };
  } finally {
    db.close();
  }
}

/**
 * Verifica e decodifica um token JWT
 * Retorna os dados do usuário se válido
 */
function verificarToken(token) {
  try {
    const decoded = jwt.verify(token, JWT_SECRET);
    return decoded;
  } catch (erro) {
    throw new Error('Token inválido ou expirado');
  }
}

module.exports = {
  criarUsuario,
  autenticarUsuario,
  verificarToken
};
