// 매입 발주서 엑셀 다운로드 — 거래명세표 양식과 별개로 발주서 양식
import { NextRequest, NextResponse } from "next/server";
import { queryOne, queryRows } from "@/lib/db";
import { requireMomoAdmin } from "@/lib/momo-guard";
import * as XLSX from "xlsx";

export async function GET(_req: NextRequest, ctx: { params: Promise<{ id: string }> }) {
  const g = await requireMomoAdmin();
  if (g instanceof NextResponse) return g;

  const { id } = await ctx.params;
  const proc = await queryOne<Record<string, unknown>>(
    `SELECT P.proc_no, TO_CHAR(P.proc_date,'YYYY-MM-DD') AS proc_date,
            P.status, P.total_amount, P.memo,
            P.delivery_place, P.delivery_period, P.payment_terms, P.freight_terms,
            V.supply_name AS vendor_name,
            V.charge_user_name AS vendor_contact,
            V.supply_tel_no AS vendor_phone,
            V.email AS vendor_email,
            V.supply_address AS vendor_address
     FROM momo_procurements P
     LEFT JOIN supply_mng V ON P.vendor_objid = V.objid::text
     WHERE P.objid = $1`,
    [id]
  );
  if (!proc) return NextResponse.json({ success: false, message: "찾을 수 없음" }, { status: 404 });

  const items = await queryRows<Record<string, unknown>>(
    `SELECT I.item_code, I.item_name, I.unit, PI.qty, PI.cost_price, PI.total_amount
     FROM momo_procurement_items PI JOIN momo_items I ON PI.item_objid = I.objid
     WHERE PI.proc_objid = $1 ORDER BY PI.objid`,
    [id]
  );

  // 발주서 시트 작성 (이미지 양식 모방)
  const wb = XLSX.utils.book_new();
  const aoa: (string | number)[][] = [];
  aoa.push(["", "", "발 주 서", "", "", "", ""]);
  aoa.push([]);
  aoa.push(["분류번호", "매입발주", "", "", "", "", ""]);
  aoa.push(["발주서번호", String(proc.proc_no), "", "", "", "", ""]);
  aoa.push(["발주일", String(proc.proc_date), "", "", "", "", ""]);
  aoa.push(["공급업체", String(proc.vendor_name ?? "-"), "", "", "", "", ""]);
  aoa.push(["연락처", String(proc.vendor_phone ?? "-"), "", "", "", "", ""]);
  aoa.push(["이메일", String(proc.vendor_email ?? "-"), "", "", "", "", ""]);
  aoa.push([]);
  aoa.push(["1. 물품의 표시"]);
  aoa.push(["#", "품목코드", "품명", "단위", "수량", "단가", "금액"]);
  items.forEach((it, idx) => {
    aoa.push([
      idx + 1,
      String(it.item_code ?? ""),
      String(it.item_name ?? ""),
      String(it.unit ?? "EA"),
      Number(it.qty),
      Number(it.cost_price),
      Number(it.total_amount),
    ]);
  });
  aoa.push([]);
  aoa.push(["", "", "", "", "", "총액", Number(proc.total_amount)]);
  aoa.push(["", "", "", "", "", "(V.A.T 별도)", ""]);
  aoa.push([]);
  aoa.push(["2. 납품조건"]);
  aoa.push(["1) 상기 품목의 납기 지연 시, 지연일수 매 1일에 대하여 미납 금액의 3/1000을 납품대금 지불 시 우선 공제한다."]);
  aoa.push(["2) 납품된 물품은 당사의 지정인에게 검수를 받아야 하며, 부적합품은 즉시 납품자의 비용으로 반출하여야 한다."]);
  aoa.push(["3) 상기 수량 및 규격은 당사의 사정에 의하여 변경될 수 있으며, 납품자는 이에 대하여 이의를 제기할 수 없다."]);
  aoa.push(["4) 납품장소", String(proc.delivery_place ?? ""), "", "6) 대금지불", String(proc.payment_terms ?? "")]);
  aoa.push(["5) 납품기간", String(proc.delivery_period ?? ""), "", "7) 운임부담", String(proc.freight_terms ?? "")]);
  aoa.push(["8) 본 발주서는 납품자가 FAX 또는 기타 방법으로 접수 후 3일 이내에 이의를 제기치 않으면 제반 법적 효력을 발휘한다."]);
  aoa.push(["9) 상기 조항에 명시되지 아니한 사항은 상호 협의하고, 협의가 불가능할 경우에는 당사의 해석에 따른다."]);
  aoa.push([]);
  aoa.push(["3. 비고"]);
  aoa.push([String(proc.memo ?? "")]);
  aoa.push([]);
  aoa.push([]);
  aoa.push(["", "", "상기와 같이 발주합니다."]);
  aoa.push(["", "", String(proc.proc_date)]);
  aoa.push([]);
  aoa.push(["", "", "발주자: " + (process.env.MOMO_COMPANY_NAME ?? "모모유통") + "  " + (process.env.MOMO_COMPANY_CEO ?? "")]);
  aoa.push(["", "", "전화: " + (process.env.MOMO_PHONE ?? ""), "이메일: " + (process.env.MOMO_EMAIL ?? "")]);

  const ws = XLSX.utils.aoa_to_sheet(aoa);
  ws["!cols"] = [
    { wch: 6 }, { wch: 14 }, { wch: 28 }, { wch: 8 }, { wch: 10 }, { wch: 12 }, { wch: 14 },
  ];
  XLSX.utils.book_append_sheet(wb, ws, "발주서");

  const buf = XLSX.write(wb, { type: "buffer", bookType: "xlsx" }) as Buffer;
  return new NextResponse(new Uint8Array(buf), {
    headers: {
      "Content-Type": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
      "Content-Disposition": `attachment; filename="발주서_${proc.proc_no}.xlsx"`,
    },
  });
}
