const { Pool } = require('pg');
require('dotenv').config();

const dbPool = new Pool({
  connectionString: process.env.DATABASE_URL
});

function readAgentConfig() {
  try {
    const fs = require('fs');
    const path = require('path');
    const CONFIG_FILE_PATH = path.join(__dirname, '../agent_config.json');
    if (fs.existsSync(CONFIG_FILE_PATH)) {
      return JSON.parse(fs.readFileSync(CONFIG_FILE_PATH, 'utf8'));
    }
  } catch (err) {
    console.error('Erro ao ler agent_config.json:', err);
  }
  return {};
}

async function test() {
  try {
    const crianca = 'Maria';
    const modeloId = 2; // O ID de Avaliação Semestral Individual

    // 1. Buscar o modelo/template
    const templateRes = await dbPool.query("SELECT * FROM escola.modelos WHERE id = $1;", [modeloId]);
    const template = templateRes.rows[0];
    console.log('Template:', template.nome);

    // 2. Buscar as observações
    let sql = `
      SELECT date, time, report, criancas, tags 
      FROM escola.observacoes 
      WHERE 1=1
    `;
    const params = [];
    let pCount = 1;

    sql += ` AND (
      (jsonb_typeof(criancas) = 'array' AND EXISTS (
        SELECT 1 FROM jsonb_array_elements_text(criancas) AS c 
        WHERE LOWER(c) LIKE $${pCount}
      ))
      OR jsonb_typeof(criancas) = 'null'
      OR criancas IS NULL
    )`;
    params.push(`%${crianca.toLowerCase()}%`);
    pCount++;

    sql += ` ORDER BY date ASC`;
    const dbRes = await dbPool.query(sql, params);
    const observations = dbRes.rows;
    console.log('Quantidade de observações:', observations.length);

    // 3. Montar prompt
    const combinedObsText = observations.map((o, idx) => {
      const dateText = o.date ? `Data: ${o.date}` : '';
      const tagsText = o.tags ? `Tags: ${Array.isArray(o.tags) ? o.tags.join(', ') : o.tags}` : '';
      return `[Observação #${idx + 1} ${dateText} ${tagsText}]\n${o.report}`;
    }).join('\n\n---\n\n');

    const agentConfig = readAgentConfig();
    const agentName = agentConfig.agentName || "PedagogIA";

    const targetStudentInfo = `\nATENÇÃO CRÍTICA: A criança que está sendo avaliada e para quem você deve gerar o relatório individual é especificamente: "${crianca}". Todas as observações, avanços, preferências e conclusões descritas na PARTE 2 (Desenvolvimento Individual) devem referir-se exclusivamente a ${crianca}. Nunca confunda ${crianca} com outros colegas eventualmente citados nas observações (como Joãozinho, Vanderlei, etc.), e não atribua as ações deles a ela.\n`;

    const systemPrompt = `Você é a ${agentName}, uma assistente pedagógica e especialista em educação infantil.
Seu objetivo é analisar o histórico de observações de uma criança e redigir um relatório pedagógico consolidado e profissional sobre o desenvolvimento individual desta criança.
${targetStudentInfo}

Você DEVE estruturar o relatório seguindo exatamente as seções e diretrizes fornecidas no modelo de relatório selecionado.

MODELO DE RELATÓRIO: "${template.nome}"
FINALIDADE: "${template.finalidade || 'Não informada'}"
PERIODICIDADE: "${template.periodicidade || 'Não informada'}"

ESTRUTURA/DIRETRIZES DO MODELO:
"""
${template.estrutura}
"""

HISTÓRICO DE OBSERVAÇÕES REGISTRADAS:
"""
${combinedObsText}
"""

Orientações adicionais:
- Redija o relatório em português brasileiro formal e adequado para pedagogia.
- Preencha cada seção da estrutura de forma rica e detalhada, baseando-se estritamente nos fatos reais descritos nas observações.
- Não invente acontecimentos que não estejam descritos nas observações, mas faça as conexões pedagógicas pertinentes de acordo com as evidências apresentadas.
- Retorne apenas o relatório em formato Markdown estruturado.`;

    let generatedReport = '';

    // Tenta OpenRouter
    try {
      console.log('Chamando OpenRouter...');
      const response = await fetch('https://openrouter.ai/api/v1/chat/completions', {
        method: 'POST',
        headers: {
          'Authorization': `Bearer ${process.env.OPENROUTER_API_KEY}`,
          'Content-Type': 'application/json'
        },
        body: JSON.stringify({
          model: process.env.OPENROUTER_MODEL || 'openai/gpt-4.1-nano',
          messages: [{ role: 'user', content: systemPrompt }],
          temperature: 0.5,
          max_tokens: 6000
        })
      });
      if (response.ok) {
        const data = await response.json();
        generatedReport = data.choices?.[0]?.message?.content || '';
        console.log('OpenRouter OK! Comprimento:', generatedReport.length);
      } else {
        console.warn('Falha no OpenRouter status:', response.status, await response.text());
      }
    } catch (err) {
      console.error('Erro no OpenRouter:', err.message);
    }

    // Fallback para Google Gemini
    if (!generatedReport && process.env.GOOGLE_AI_API_KEY) {
      try {
        console.log('Fallback para Google Gemini...');
        const response = await fetch(`https://generativelanguage.googleapis.com/v1beta/models/${process.env.GOOGLE_AI_MODEL || 'gemini-2.5-flash'}:generateContent?key=${process.env.GOOGLE_AI_API_KEY}`, {
          method: 'POST',
          headers: { 'Content-Type': 'application/json' },
          body: JSON.stringify({
            contents: [{ parts: [{ text: systemPrompt }] }],
            generationConfig: { temperature: 0.5, maxOutputTokens: 8192 }
          })
        });
        if (response.ok) {
          const data = await response.json();
          generatedReport = data.candidates?.[0]?.content?.parts?.[0]?.text || '';
          console.log('Google Gemini OK! Comprimento:', generatedReport.length);
        } else {
          console.warn('Falha no Google Gemini status:', response.status, await response.text());
        }
      } catch (err) {
        console.error('Erro no Google Gemini:', err.message);
      }
    }

    // Fallback para Groq
    if (!generatedReport && process.env.GROQ_API_KEY) {
      try {
        console.log('Fallback para Groq...');
        const response = await fetch('https://api.groq.com/openai/v1/chat/completions', {
          method: 'POST',
          headers: {
            'Authorization': `Bearer ${process.env.GROQ_API_KEY}`,
            'Content-Type': 'application/json'
          },
          body: JSON.stringify({
            model: process.env.GROQ_MODEL || 'llama-3.3-70b-versatile',
            messages: [{ role: 'user', content: systemPrompt }],
            temperature: 0.5,
            max_tokens: 6000
          })
        });
        if (response.ok) {
          const data = await response.json();
          generatedReport = data.choices?.[0]?.message?.content || '';
          console.log('Groq OK! Comprimento:', generatedReport.length);
        } else {
          console.warn('Falha no Groq status:', response.status, await response.text());
        }
      } catch (err) {
        console.error('Erro no Groq:', err.message);
      }
    }

    console.log('=== REPORT GENERATED ===');
    console.log(generatedReport);
    console.log('========================');

  } catch (err) {
    console.error(err);
  } finally {
    await dbPool.end();
  }
}

test();
