/**
 * DocuAgro - Setup do Banco de Dados SQLite
 * Cria todas as tabelas necessárias para o MVP
 */

const Database = require('better-sqlite3');
const path = require('path');
const fs = require('fs');

// Garante que o diretório data existe
const dataDir = path.join(__dirname, '..', 'data');
if (!fs.existsSync(dataDir)) fs.mkdirSync(dataDir, { recursive: true });

const dbPath = process.env.DB_PATH || path.join(dataDir, 'docuagro.db');
const db = new Database(dbPath);

// Habilita WAL para melhor performance
db.pragma('journal_mode = WAL');
db.pragma('foreign_keys = ON');

console.log('🌱 Criando banco de dados DocuAgro...\n');

// === Tabela: Cooperativas ===
db.exec(`
  CREATE TABLE IF NOT EXISTS cooperativas (
    id TEXT PRIMARY KEY,
    nome TEXT NOT NULL,
    cnpj TEXT,
    email TEXT,
    telefone TEXT,
    senha_hash TEXT,
    criado_em DATETIME DEFAULT CURRENT_TIMESTAMP,
    atualizado_em DATETIME DEFAULT CURRENT_TIMESTAMP
  )
`);
console.log('✅ Tabela cooperativas criada');

// === Tabela: Produtores ===
db.exec(`
  CREATE TABLE IF NOT EXISTS produtores (
    id TEXT PRIMARY KEY,
    cooperativa_id TEXT NOT NULL,
    nome TEXT NOT NULL,
    cpf_cnpj TEXT,
    telefone TEXT,
    telegram_chat_id TEXT UNIQUE,
    telegram_username TEXT,
    propriedade_nome TEXT,
    propriedade_municipio TEXT,
    propriedade_estado TEXT,
    propriedade_area_ha REAL,
    cultura_principal TEXT,
    status TEXT DEFAULT 'pendente' CHECK(status IN ('pendente', 'em_andamento', 'completo', 'irregular')),
    etapa_atual TEXT DEFAULT 'onboarding',
    docs_completos INTEGER DEFAULT 0,
    docs_total INTEGER DEFAULT 8,
    criado_em DATETIME DEFAULT CURRENT_TIMESTAMP,
    atualizado_em DATETIME DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (cooperativa_id) REFERENCES cooperativas(id)
  )
`);
console.log('✅ Tabela produtores criada');

// === Tabela: Documentos ===
db.exec(`
  CREATE TABLE IF NOT EXISTS documentos (
    id TEXT PRIMARY KEY,
    produtor_id TEXT NOT NULL,
    tipo TEXT NOT NULL CHECK(tipo IN (
      'car', 'ccir', 'itr', 'georreferenciamento',
      'licenca_ambiental', 'contrato_arrendamento',
      'nota_fiscal', 'declaracao_desmatamento'
    )),
    status TEXT DEFAULT 'pendente' CHECK(status IN (
      'pendente', 'enviado', 'validando', 'aprovado', 'rejeitado', 'vencido'
    )),
    arquivo_path TEXT,
    arquivo_nome TEXT,
    arquivo_tipo TEXT,
    arquivo_tamanho INTEGER,
    dados_extraidos TEXT,
    validacao_resultado TEXT,
    validacao_detalhes TEXT,
    validade DATE,
    enviado_em DATETIME,
    validado_em DATETIME,
    criado_em DATETIME DEFAULT CURRENT_TIMESTAMP,
    atualizado_em DATETIME DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (produtor_id) REFERENCES produtores(id)
  )
`);
console.log('✅ Tabela documentos criada');

// === Tabela: Conversas (histórico) ===
db.exec(`
  CREATE TABLE IF NOT EXISTS conversas (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    produtor_id TEXT NOT NULL,
    chat_id TEXT NOT NULL,
    role TEXT NOT NULL CHECK(role IN ('user', 'assistant', 'system')),
    conteudo TEXT NOT NULL,
    tipo_mensagem TEXT DEFAULT 'texto',
    criado_em DATETIME DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (produtor_id) REFERENCES produtores(id)
  )
`);
console.log('✅ Tabela conversas criada');

// === Tabela: Dossiês ===
db.exec(`
  CREATE TABLE IF NOT EXISTS dossies (
    id TEXT PRIMARY KEY,
    produtor_id TEXT NOT NULL,
    arquivo_path TEXT NOT NULL,
    versao INTEGER DEFAULT 1,
    docs_incluidos TEXT,
    gerado_em DATETIME DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (produtor_id) REFERENCES produtores(id)
  )
`);
console.log('✅ Tabela dossiês criada');

// === Tabela: Usuarios (autenticação JWT) ===
db.exec(`
  CREATE TABLE IF NOT EXISTS usuarios (
    id TEXT PRIMARY KEY,
    cooperativa_id TEXT,
    username TEXT UNIQUE NOT NULL,
    senha_hash TEXT NOT NULL,
    nome TEXT,
    role TEXT DEFAULT 'admin',
    criado_em DATETIME DEFAULT CURRENT_TIMESTAMP
  )
`);
console.log('✅ Tabela usuarios criada');

// === Índices ===
db.exec(`
  CREATE INDEX IF NOT EXISTS idx_produtores_cooperativa ON produtores(cooperativa_id);
  CREATE INDEX IF NOT EXISTS idx_produtores_telegram ON produtores(telegram_chat_id);
  CREATE INDEX IF NOT EXISTS idx_produtores_status ON produtores(status);
  CREATE INDEX IF NOT EXISTS idx_documentos_produtor ON documentos(produtor_id);
  CREATE INDEX IF NOT EXISTS idx_documentos_tipo ON documentos(tipo);
  CREATE INDEX IF NOT EXISTS idx_documentos_status ON documentos(status);
  CREATE INDEX IF NOT EXISTS idx_conversas_produtor ON conversas(produtor_id);
  CREATE INDEX IF NOT EXISTS idx_conversas_chat ON conversas(chat_id);
`);
console.log('✅ Índices criados');

// === Cooperativa padrão (MVP) ===
const coopExiste = db.prepare('SELECT id FROM cooperativas WHERE id = ?').get('coop_001');
if (!coopExiste) {
  db.prepare(`
    INSERT INTO cooperativas (id, nome, cnpj, email)
    VALUES (?, ?, ?, ?)
  `).run('coop_001', 'Cooperativa Piloto', '00.000.000/0001-00', 'contato@cooperativa.com');
  console.log('✅ Cooperativa piloto criada');
}

// === Usuário admin padrão ===
const bcrypt = require('bcryptjs');
const { v4: uuidv4 } = require('uuid');

const adminExiste = db.prepare("SELECT id FROM usuarios WHERE username = 'admin'").get();
if (!adminExiste) {
  const senhaHash = bcrypt.hashSync('DocuAgro2026!', 10);
  db.prepare(`
    INSERT INTO usuarios (id, cooperativa_id, username, senha_hash, nome, role)
    VALUES (?, 'coop_001', 'admin', ?, 'Administrador', 'admin')
  `).run(uuidv4(), senhaHash);
  console.log('✅ Usuário admin padrão criado (admin / DocuAgro2026!)');
} else {
  console.log('ℹ️  Usuário admin já existe');
}

console.log('\n🎉 Banco de dados configurado com sucesso!');
console.log(`📁 Arquivo: ${dbPath}\n`);

db.close();
