/**
 * Runner de schema/migrations simples. Aplica `db/schema.sql` numa base nova
 * e semeia templates padrão. Idempotente: se as tabelas já existem, só faz o
 * seed que estiver faltando.
 *
 * Uso: npm run migrate
 */
import { readFile } from "node:fs/promises";
import { join } from "node:path";
import mysql from "mysql2/promise";
import { env } from "../src/config/env.js";

async function main(): Promise<void> {
  const conn = await mysql.createConnection({
    host: env.DB_HOST,
    port: env.DB_PORT,
    user: env.DB_USER,
    password: env.DB_PASSWORD,
    database: env.DB_NAME,
    multipleStatements: true,
    namedPlaceholders: true,
  });

  try {
    const [tables] = await conn.query<mysql.RowDataPacket[]>(
      `SELECT COUNT(*) AS n FROM information_schema.tables
        WHERE table_schema = :db AND table_name = 'panel_users'`,
      { db: env.DB_NAME },
    );
    const hasSchema = Number(tables[0]?.n ?? 0) > 0;

    if (!hasSchema) {
      const schemaPath = join(process.cwd(), "db", "schema.sql");
      const sql = await readFile(schemaPath, "utf8");
      console.log("Aplicando db/schema.sql...");
      await conn.query(sql);
      console.log("Schema aplicado.");
    } else {
      console.log("Schema já existe — pulando criação de tabelas.");
    }

    await seedTemplates(conn);
    console.log("Migração concluída.");
  } finally {
    await conn.end();
  }
}

async function seedTemplates(conn: mysql.Connection): Promise<void> {
  const [rows] = await conn.query<mysql.RowDataPacket[]>(
    `SELECT COUNT(*) AS n FROM message_templates`,
  );
  if (Number(rows[0]?.n ?? 0) > 0) {
    console.log("Templates já existem — pulando seed.");
    return;
  }
  console.log("Semeando templates padrão...");
  await conn.query(
    `INSERT INTO message_templates (trigger_key, title, body, enabled) VALUES
      ('paid_new_customer_validation', 'Validação de cliente novo',
       'Olá {nome}! Para liberar sua ordem {ordem} preciso validar seu cadastro. Pode me enviar seu CPF e telefone, por favor?', 1),
      ('counterparty_selling_pix', 'Solicitar chave PIX',
       'Olá {nome}! Para concluir a ordem {ordem} ({valor} {fiat}), envie sua chave PIX, por favor.', 1)`,
  );
}

main().catch((err) => {
  console.error("Falha na migração:", err instanceof Error ? err.message : err);
  process.exit(1);
});
