import { env } from "cloudflare:workers";

type RuntimeEnv = {
  DB: D1Database;
  MEDIA: R2Bucket;
  LLOYD_API_BASE_URL?: string;
  LLOYD_API_KEY?: string;
  LLOYD_API_SECRET?: string;
  ADMIN_EMAILS?: string;
};

export function runtimeEnv(): RuntimeEnv {
  return env as unknown as RuntimeEnv;
}

export async function ensureDatabase() {
  const { DB } = runtimeEnv();
  if (!DB) throw new Error("Database binding is unavailable.");

  await DB.batch([
    DB.prepare(`CREATE TABLE IF NOT EXISTS settings (
      id INTEGER PRIMARY KEY,
      price REAL NOT NULL DEFAULT 2000,
      redirect_url TEXT NOT NULL DEFAULT 'https://example.com',
      popup_title TEXT NOT NULL DEFAULT 'Lipia ili kuendelea',
      popup_description TEXT NOT NULL DEFAULT 'Weka namba yako ya simu yenye pesa. Utapokea ombi la kuthibitisha malipo.',
      updated_at TEXT NOT NULL
    )`),
    DB.prepare(`CREATE TABLE IF NOT EXISTS transactions (
      id INTEGER PRIMARY KEY AUTOINCREMENT,
      order_id TEXT NOT NULL UNIQUE,
      phone TEXT NOT NULL,
      amount REAL NOT NULL,
      currency TEXT NOT NULL DEFAULT 'TZS',
      status TEXT NOT NULL DEFAULT 'PENDING',
      channel TEXT,
      reference TEXT,
      transid TEXT,
      created_at TEXT NOT NULL,
      updated_at TEXT NOT NULL
    )`),
    DB.prepare(`CREATE INDEX IF NOT EXISTS transactions_created_at_idx ON transactions (created_at DESC)`),
    DB.prepare(`CREATE TABLE IF NOT EXISTS media (
      id TEXT PRIMARY KEY,
      object_key TEXT NOT NULL,
      filename TEXT NOT NULL,
      content_type TEXT NOT NULL,
      sort_order INTEGER NOT NULL DEFAULT 0,
      created_at TEXT NOT NULL
    )`),
    DB.prepare(`CREATE INDEX IF NOT EXISTS media_sort_order_idx ON media (sort_order ASC)`),
  ]);

  await DB.prepare(`INSERT OR IGNORE INTO settings
    (id, price, redirect_url, popup_title, popup_description, updated_at)
    VALUES (1, 2000, 'https://example.com', 'Lipia ili kuendelea',
    'Weka namba yako ya simu yenye pesa. Utapokea ombi la kuthibitisha malipo.', ?)`)
    .bind(new Date().toISOString())
    .run();

  return DB;
}

export async function isAdminEmail(email: string) {
  const configured = runtimeEnv().ADMIN_EMAILS;
  if (!configured) return false;
  const allowed = configured.split(",").map((value) => value.trim().toLowerCase()).filter(Boolean);
  return allowed.includes(email.trim().toLowerCase());
}

export function publicSettings(row: Record<string, unknown>) {
  return {
    price: Number(row.price),
    redirectUrl: String(row.redirect_url),
    popupTitle: String(row.popup_title),
    popupDescription: String(row.popup_description),
  };
}
