import mysql from "mysql2/promise";

const pool = mysql.createPool({
  host: process.env.DB_HOST || "localhost",
  user: process.env.DB_USER || "root",
  password: process.env.DB_PASS || "",
  database: process.env.DB_NAME || "paramvir_power",
  connectionLimit: 10,
});

type SqlValue = string | number | Buffer | null | Date;

export async function insert(table: string, data: Record<string, SqlValue>): Promise<boolean> {
  const keys = Object.keys(data);
  if (!keys.length) return false;
  const cols = keys.join(", ");
  const placeholders = keys.map(() => "?").join(", ");
  await pool.execute(`INSERT INTO \`${table}\` (${cols}) VALUES (${placeholders})`, keys.map((k) => data[k]));
  return true;
}

export async function findOne(
  table: string,
  where: Record<string, SqlValue>
): Promise<Record<string, unknown> | null> {
  const keys = Object.keys(where);
  if (!keys.length) return null;
  const clause = keys.map((k) => `\`${k}\` = ?`).join(" AND ");
  const [rows] = await pool.execute(`SELECT * FROM \`${table}\` WHERE ${clause} LIMIT 1`, keys.map((k) => where[k]));
  const list = rows as Record<string, unknown>[];
  return list.length ? list[0] : null;
}

export function now(): string {
  const d = new Date();
  const pad = (n: number) => String(n).padStart(2, "0");
  return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())} ${pad(d.getHours())}:${pad(d.getMinutes())}:${pad(d.getSeconds())}`;
}
