package application

import (
	"context"
	"testing"
)

type fakeOCRRecognizer struct {
	image []byte
	text  string
}

func (f *fakeOCRRecognizer) RecognizeText(_ context.Context, pngBytes []byte) (string, error) {
	f.image = append([]byte(nil), pngBytes...)
	if f.text == "" {
		return "extracted text", nil
	}
	return f.text, nil
}

func TestCaptureOCRServiceRecognizesAndCopies(t *testing.T) {
	ctx := context.Background()
	recognizer := &fakeOCRRecognizer{}
	clip := &fakeClipboard{}
	svc := &CaptureOCRService{Recognizer: recognizer, Clipboard: clip}

	text, err := svc.Recognize(ctx, []byte("png"))
	if err != nil {
		t.Fatalf("recognize: %v", err)
	}
	if string(recognizer.image) != "png" {
		t.Fatalf("expected screenshot bytes forwarded, got %q", string(recognizer.image))
	}
	if text != "extracted text" {
		t.Fatalf("expected extracted text, got %q", text)
	}
	if err := svc.CopyText(ctx, text); err != nil {
		t.Fatalf("copy text: %v", err)
	}
	if clip.text != "extracted text" {
		t.Fatalf("expected ocr text copied, got %q", clip.text)
	}
}

func TestCaptureOCRServiceRejectsEmptyResult(t *testing.T) {
	svc := &CaptureOCRService{Recognizer: &fakeOCRRecognizer{text: " \n "}}
	if _, err := svc.Recognize(context.Background(), []byte("png")); err == nil {
		t.Fatalf("expected empty OCR result to fail")
	}
}
