//nolint:mnd
package fbdraw

import (
	"fmt"

	"git.eeqj.de/sneak/hdmistat/internal/font"
	"github.com/golang/freetype"
	"github.com/golang/freetype/truetype"
	"golang.org/x/image/font/gofont/goregular"
)

// CalculateCharDimensions calculates the character dimensions for a given font and size
func CalculateCharDimensions(
	fontFamily font.FontFamily,
	fontSize float64,
) (charWidth, charHeight int, err error) {
	// Load a sample font to measure
	f, err := font.LoadFont(fontFamily, font.WeightRegular, false)
	if err != nil {
		// Fallback to built-in font
		f, err = truetype.Parse(goregular.TTF)
		if err != nil {
			return 0, 0, err
		}
	}

	// Create a context to measure font metrics
	c := freetype.NewContext()
	c.SetFont(f)
	c.SetFontSize(fontSize)
	c.SetDPI(72)

	// Get font face for measurements
	face := truetype.NewFace(f, &truetype.Options{
		Size: fontSize,
		DPI:  72,
	})

	// For monospace fonts, get the advance width
	advance, _ := face.GlyphAdvance('M')
	charWidth = advance.Round() - 1 // Slightly tighter kerning

	// Get line height from metrics
	metrics := face.Metrics()
	charHeight = metrics.Height.Round() + 3 // Add extra leading for better line spacing

	fmt.Printf(
		"Font metrics: advance=%v (rounded=%d), height=%v (rounded=%d, with +3 leading)\n",
		advance,
		charWidth,
		metrics.Height,
		charHeight,
	)

	return charWidth, charHeight, nil
}

// CalculateGridSize calculates the grid dimensions that fit in the given pixel dimensions
func CalculateGridSize(
	pixelWidth, pixelHeight int,
	fontFamily font.FontFamily,
	fontSize float64,
) (gridWidth, gridHeight int, err error) {
	charWidth, charHeight, err := CalculateCharDimensions(
		fontFamily,
		fontSize,
	)
	if err != nil {
		return 0, 0, err
	}

	gridWidth = pixelWidth / charWidth
	gridHeight = pixelHeight / charHeight

	return gridWidth, gridHeight, nil
}
