package onnx

import (
	"encoding/json"
	"image/png"
	"os"
	"path/filepath"
	"testing"

	"chirami/internal/ocr"
)

type fixtureRef struct {
	Text  string     `json:"text"`
	Lines []ocr.Line `json:"lines"`
}

func TestPipelineParity(t *testing.T) {
	modelsDir := os.Getenv("CHIRAMI_OCR_MODELS")
	if modelsDir == "" {
		t.Skip("skipping pipeline parity test: CHIRAMI_OCR_MODELS not set")
	}

	err := InitRuntime("")
	if err != nil {
		t.Fatalf("InitRuntime: %v", err)
	}

	pipe, err := NewPipeline(modelsDir)
	if err != nil {
		t.Fatalf("NewPipeline: %v", err)
	}
	defer pipe.Close()

	refBytes, err := os.ReadFile("testdata/reference.json")
	if err != nil {
		t.Fatalf("read reference.json: %v", err)
	}
	var refs map[string]fixtureRef
	if err := json.Unmarshal(refBytes, &refs); err != nil {
		t.Fatalf("parse reference.json: %v", err)
	}

	for file, want := range refs {
		t.Run(file, func(t *testing.T) {
			f, err := os.Open(filepath.Join("testdata", file))
			if err != nil {
				t.Fatalf("open %s: %v", file, err)
			}
			defer f.Close()

			img, err := png.Decode(f)
			if err != nil {
				t.Fatalf("decode png: %v", err)
			}

			res, err := pipe.Recognize(img)
			if err != nil {
				t.Fatalf("recognize: %v", err)
			}

			if got := res.Text(); got != want.Text {
				t.Errorf("text mismatch: got %q, want %q", got, want.Text)
			}

			if len(res.Lines) != len(want.Lines) {
				t.Fatalf("lines count mismatch: got %d, want %d (%+v vs %+v)",
					len(res.Lines), len(want.Lines), res.Lines, want.Lines)
			}

			for i, l := range res.Lines {
				wl := want.Lines[i]
				if l.Text != wl.Text || l.Vertical != wl.Vertical {
					t.Errorf("line %d mismatch: got {Text:%q Vertical:%v}, want {Text:%q Vertical:%v}",
						i, l.Text, l.Vertical, wl.Text, wl.Vertical)
				}
			}
		})
	}
}
