package icon

import (
	"bytes"
	"image"
	"image/color"
	"image/png"
	"testing"
)

func TestEmbeddedPNGIconsDecode(t *testing.T) {
	tests := map[string][]byte{
		"app":         AppPNG(),
		"rounded-app": RoundedAppPNG(),
		"dock":        DockPNG(),
		"app-white":   AppWhitePNG(),
		"tray":        TrayPNG(),
		"tray-black":  TrayBlackPNG(),
		"tray-white":  TrayWhitePNG(),
	}

	for name, data := range tests {
		t.Run(name, func(t *testing.T) {
			if len(data) == 0 {
				t.Fatal("icon data is empty")
			}
			if _, err := png.DecodeConfig(bytes.NewReader(data)); err != nil {
				t.Fatalf("decode PNG icon: %v", err)
			}
		})
	}
}

func TestDockPNGUsesRoundedAppPNG(t *testing.T) {
	if !bytes.Equal(DockPNG(), RoundedAppPNG()) {
		t.Fatal("DockPNG must use the same rounded icon as other native app switchers")
	}
}

func TestDockPNGUsesRoundedTransparentCorners(t *testing.T) {
	appConfig, err := png.DecodeConfig(bytes.NewReader(AppPNG()))
	if err != nil {
		t.Fatalf("decode app PNG config: %v", err)
	}
	dockImage, err := png.Decode(bytes.NewReader(DockPNG()))
	if err != nil {
		t.Fatalf("decode dock PNG: %v", err)
	}
	if got := dockImage.Bounds().Dx(); got != appConfig.Width {
		t.Fatalf("dock icon width = %d, want %d", got, appConfig.Width)
	}
	if got := dockImage.Bounds().Dy(); got != appConfig.Height {
		t.Fatalf("dock icon height = %d, want %d", got, appConfig.Height)
	}

	bounds := dockImage.Bounds()
	corner := color.NRGBAModel.Convert(dockImage.At(bounds.Min.X, bounds.Min.Y)).(color.NRGBA)
	if corner.A != 0 {
		t.Fatalf("dock icon top-left alpha = %d, want transparent rounded corner", corner.A)
	}

	center := color.NRGBAModel.Convert(dockImage.At(bounds.Min.X+bounds.Dx()/2, bounds.Min.Y+bounds.Dy()/2)).(color.NRGBA)
	if center.A != 255 {
		t.Fatalf("dock icon center alpha = %d, want opaque center", center.A)
	}
}

func TestRoundPNGCornersPreservesOpaqueCenter(t *testing.T) {
	src := image.NewNRGBA(image.Rect(0, 0, 16, 16))
	for y := 0; y < 16; y++ {
		for x := 0; x < 16; x++ {
			src.SetNRGBA(x, y, color.NRGBA{R: 10, G: 20, B: 30, A: 200})
		}
	}
	var buf bytes.Buffer
	if err := png.Encode(&buf, src); err != nil {
		t.Fatalf("encode fixture: %v", err)
	}

	rounded, err := roundPNGCorners(buf.Bytes())
	if err != nil {
		t.Fatalf("round PNG corners: %v", err)
	}
	img, err := png.Decode(bytes.NewReader(rounded))
	if err != nil {
		t.Fatalf("decode rounded PNG: %v", err)
	}

	corner := color.NRGBAModel.Convert(img.At(0, 0)).(color.NRGBA)
	if corner.A != 0 {
		t.Fatalf("rounded fixture corner alpha = %d, want 0", corner.A)
	}
	center := color.NRGBAModel.Convert(img.At(8, 8)).(color.NRGBA)
	if center.A != 200 {
		t.Fatalf("rounded fixture center alpha = %d, want source alpha 200", center.A)
	}
}
