import type { RowDataPacket } from "mysql2/promise";
import { pool } from "../db/mysql.js";
import { decrypt, encrypt } from "../crypto/secretbox.js";

/**
 * Configuração geral chave/valor (`app_settings`). Valores normais em
 * `value_text`; segredos (token do bot Telegram) em `value_enc` (cripto).
 */

interface SettingRow extends RowDataPacket {
  setting_key: string;
  value_text: string | null;
  value_enc: Buffer | null;
}

export async function getText(key: string): Promise<string | null> {
  const [rows] = await pool.query<SettingRow[]>(
    `SELECT value_text FROM app_settings WHERE setting_key = :key`,
    { key },
  );
  return rows[0]?.value_text ?? null;
}

export async function setText(key: string, value: string | null): Promise<void> {
  await pool.query(
    `INSERT INTO app_settings (setting_key, value_text) VALUES (:key, :value)
     ON DUPLICATE KEY UPDATE value_text = VALUES(value_text)`,
    { key, value },
  );
}

export async function getSecret(key: string): Promise<string | null> {
  const [rows] = await pool.query<SettingRow[]>(
    `SELECT value_enc FROM app_settings WHERE setting_key = :key`,
    { key },
  );
  const enc = rows[0]?.value_enc ?? null;
  return enc ? decrypt(enc) : null;
}

export async function setSecret(key: string, value: string | null): Promise<void> {
  await pool.query(
    `INSERT INTO app_settings (setting_key, value_enc) VALUES (:key, :value)
     ON DUPLICATE KEY UPDATE value_enc = VALUES(value_enc)`,
    { key, value: value ? encrypt(value) : null },
  );
}

export async function hasSecret(key: string): Promise<boolean> {
  const [rows] = await pool.query<SettingRow[]>(
    `SELECT value_enc FROM app_settings WHERE setting_key = :key`,
    { key },
  );
  return !!rows[0]?.value_enc;
}

/* Chaves conhecidas da ponte Telegram. */
export const TELEGRAM_BOT_TOKEN = "telegram_bot_token"; // secret
export const TELEGRAM_CHAT_ID = "telegram_chat_id"; // text
export const TELEGRAM_ENABLED = "telegram_enabled"; // text "1"/"0"
