1import { resolveTokenColor } from "@/features/editor/tokenColor"
2import { loadImageElement } from "@/lib/imageElement"
3import { getLayout, type LayoutId } from "@/lib/layouts"
4
5/* FR-12: lembar cetak 4R 1200 x 1800 px berisi dua strip berdampingan dengan
6 garis potong di tengah. Komposisinya murni Canvas2D, tanpa Konva, supaya
7 halaman Hasil tidak perlu menyentuh panggung lagi untuk urusan cetak.
8 Layout Grid 2 x 2 (FR-03) sudah selebar lembar 4R: hasil ekspornya
9 dikembalikan apa adanya, tanpa duplikasi dan tanpa garis potong. */
10
11const SHEET_WIDTH = 1200
12const SHEET_HEIGHT = 1800
13/* Strip 600 px, jadi strip kedua mulai di tengah lembar. */
14const SECOND_STRIP_X = 600
15const CUT_LINE_WIDTH = 4
16const CUT_DASH = [12, 8]
17
18/** Menggabungkan PNG strip menjadi PNG lembar 4R siap cetak. */
19export async function composePrintSheet(
20 stripDataUrl: string,
21 layoutId: LayoutId
22): Promise<string> {
23 const layout = getLayout(layoutId)
24 if (layout.canvas.width >= SHEET_WIDTH) {
25 return stripDataUrl
26 }
27
28 const strip = await loadImageElement(stripDataUrl)
29 const canvas = document.createElement("canvas")
30 canvas.width = SHEET_WIDTH
31 canvas.height = SHEET_HEIGHT
32 const context = canvas.getContext("2d")
33 if (context === null) {
34 throw new Error("Kanvas 2D tidak tersedia")
35 }
36
37 context.drawImage(strip, 0, 0)
38 context.drawImage(strip, SECOND_STRIP_X, 0)
39
40 context.strokeStyle = resolveTokenColor("--color-ink")
41 context.lineWidth = CUT_LINE_WIDTH
42 context.setLineDash(CUT_DASH)
43 context.beginPath()
44 context.moveTo(SECOND_STRIP_X, 0)
45 context.lineTo(SECOND_STRIP_X, SHEET_HEIGHT)
46 context.stroke()
47
48 return canvas.toDataURL("image/png")
49}
50