import type { RowDataPacket } from 'mysql2';
import {
  getIuePool,
  getReferenceImageBaseUrl,
} from '../config/faceVerify';

interface CustomerImageRow extends RowDataPacket {
  customer_images: string | null;
}

/** รองรับ userId แบบ "00647" / "647" */
export function studentIdVariants(userId: string): string[] {
  const v = userId.trim();
  const out = new Set<string>([v]);
  const n = parseInt(v, 10);
  if (!Number.isNaN(n)) {
    out.add(String(n));
    out.add(String(n).padStart(5, '0'));
  }
  return [...out];
}

/** decode customer_images จาก DB (data URI หรือ raw base64) */
export function decodeCustomerImageBase64(raw: string): Buffer | null {
  const trimmed = raw.trim();
  if (!trimmed) return null;

  let b64 = trimmed;
  if (/^data:image\/[a-zA-Z0-9.+-]+;base64,/.test(trimmed)) {
    b64 = trimmed.split(',', 2)[1] ?? '';
  }

  try {
    const buf = Buffer.from(b64.replace(/\s/g, ''), 'base64');
    return buf.length > 0 ? buf : null;
  } catch {
    return null;
  }
}

/** อ่าน base64 จาก tb_customer.customer_images โดยตรง */
export async function loadStudentReferenceFromDb(
  userId: string,
): Promise<Buffer | null> {
  const pool = getIuePool();
  const variants = studentIdVariants(userId);

  for (const id of variants) {
    const [rows] = await pool.query<CustomerImageRow[]>(
      'SELECT customer_images FROM tb_customer WHERE customer_id = ? LIMIT 1',
      [id],
    );
    const raw = rows[0]?.customer_images;
    if (!raw) continue;
    const buf = decodeCustomerImageBase64(raw);
    if (buf) return buf;
  }

  return null;
}

/** fallback — PHP decode base64 แล้วส่ง PNG (resize 150×150) */
export async function loadStudentReferenceFromHttp(
  userId: string,
): Promise<Buffer | null> {
  const base = getReferenceImageBaseUrl();
  const variants = studentIdVariants(userId);

  for (const id of variants) {
    const url = `${base}/${encodeURIComponent(id)}`;
    try {
      const res = await fetch(url, { signal: AbortSignal.timeout(15_000) });
      if (!res.ok) continue;
      const ct = (res.headers.get('content-type') || '').toLowerCase();
      const buf = Buffer.from(await res.arrayBuffer());
      if (!buf.length) continue;
      // PHP ส่ง PNG/JPEG binary — ไม่ใช่ JSON/base64 text
      if (ct.includes('json') || buf[0] === 0x7b /* { */) continue;
      return buf;
    } catch {
      /* try next variant */
    }
  }

  return null;
}

/** DB ก่อน (คุณภาพเต็ม) → HTTP fallback */
export async function loadStudentReferenceBuffer(userId: string): Promise<Buffer> {
  const fromDb = await loadStudentReferenceFromDb(userId);
  if (fromDb) return fromDb;

  const fromHttp = await loadStudentReferenceFromHttp(userId);
  if (fromHttp) return fromHttp;

  throw new Error(
    `ไม่พบรูปอ้างอิงนักเรียน (userId=${userId}) — ตรวจ tb_customer.customer_images`,
  );
}
