import type { ResultSetHeader, RowDataPacket } from "mysql2/promise";
import { pool } from "../db/mysql.js";

/** Templates de mensagem por gatilho (`message_templates`). */

export type TriggerKey =
  | "paid_new_customer_validation"
  | "counterparty_selling_pix"
  | "manual";

export interface TemplateRow extends RowDataPacket {
  id: number;
  trigger_key: TriggerKey;
  title: string;
  body: string;
  enabled: number;
}

export async function getEnabledByTrigger(trigger: TriggerKey): Promise<TemplateRow | null> {
  const [rows] = await pool.query<TemplateRow[]>(
    `SELECT * FROM message_templates WHERE trigger_key = :trigger AND enabled = 1
      ORDER BY id LIMIT 1`,
    { trigger },
  );
  return rows[0] ?? null;
}

export async function list(): Promise<TemplateRow[]> {
  const [rows] = await pool.query<TemplateRow[]>(`SELECT * FROM message_templates ORDER BY id`);
  return rows;
}

export async function getById(id: number): Promise<TemplateRow | null> {
  const [rows] = await pool.query<TemplateRow[]>(
    `SELECT * FROM message_templates WHERE id = :id`,
    { id },
  );
  return rows[0] ?? null;
}

export async function create(input: {
  trigger_key: TriggerKey;
  title: string;
  body: string;
  enabled?: boolean;
}): Promise<number> {
  const [res] = await pool.query<ResultSetHeader>(
    `INSERT INTO message_templates (trigger_key, title, body, enabled)
     VALUES (:trigger, :title, :body, :enabled)`,
    {
      trigger: input.trigger_key,
      title: input.title,
      body: input.body,
      enabled: input.enabled === false ? 0 : 1,
    },
  );
  return res.insertId;
}

export async function update(
  id: number,
  input: Partial<{ trigger_key: TriggerKey; title: string; body: string; enabled: boolean }>,
): Promise<void> {
  const sets: string[] = [];
  const params: Record<string, string | number> = { id };
  if (input.trigger_key !== undefined) {
    sets.push("trigger_key = :trigger");
    params.trigger = input.trigger_key;
  }
  if (input.title !== undefined) {
    sets.push("title = :title");
    params.title = input.title;
  }
  if (input.body !== undefined) {
    sets.push("body = :body");
    params.body = input.body;
  }
  if (input.enabled !== undefined) {
    sets.push("enabled = :enabled");
    params.enabled = input.enabled ? 1 : 0;
  }
  if (sets.length === 0) return;
  await pool.query(`UPDATE message_templates SET ${sets.join(", ")} WHERE id = :id`, params);
}

export async function remove(id: number): Promise<void> {
  await pool.query(`DELETE FROM message_templates WHERE id = :id`, { id });
}

/**
 * Renderiza um template substituindo `{var}` pelos valores. Variáveis sem
 * valor viram string vazia. Suporta `{nome}`, `{valor}`, `{ordem}`, etc.
 */
export function renderTemplate(body: string, vars: Record<string, string | number | null>): string {
  return body.replace(/\{(\w+)\}/g, (_, key: string) => {
    const v = vars[key];
    return v === null || v === undefined ? "" : String(v);
  });
}
