package render_image

import (
	"encoding/base64"
	"fmt"
	"image"
	"image/draw"
	_ "image/jpeg"
	_ "image/png"
	"os"

	"whspbrd/pkg/resize_image"
)

func LoadImage(filePath string) (image.Image, error) {
	f, err := os.Open(filePath)
	if err != nil {
		return nil, err
	}
	defer f.Close()
	img, _, err := image.Decode(f)
	return img, err
}

func ConvertToRGBA(img image.Image) *image.RGBA {
	rgba := image.NewRGBA(img.Bounds())
	draw.Draw(rgba, rgba.Bounds(), img, image.Point{0, 0}, draw.Src)
	return rgba
}

func EncodeImageToBase64RGBA(rgba *image.RGBA) string {
	return base64.StdEncoding.EncodeToString(rgba.Pix)
}

func RenderImage(filepath string, row int, col int, width_ int, height_ int, units bool) {
	img, err := LoadImage(filepath)
	if err != nil {
		fmt.Printf("Error loading image: %v\n", err)
		return
	}

	rgba := ConvertToRGBA(img)
	if units {
		rgba, _ = resize_image.ResizeInTerminal(*rgba, width_, height_)
	} else {
		rgba, _ = resize_image.Resize(*rgba, width_, height_)
	}
	encoded := EncodeImageToBase64RGBA(rgba)

	width := rgba.Rect.Dx()
	height := rgba.Rect.Dy()

	fmt.Printf("\033[s\033[%d;%dH", row, col)

	chunk_size := 4096
	pos := 0
	first := true
	for pos < len(encoded) {
		fmt.Print("\033_G")
		if first {
			fmt.Printf("q=2,a=T,f=32,s=%d,v=%d,", width, height)
			first = false
		}
		chunk_len := len(encoded) - pos
		if chunk_len > chunk_size {
			chunk_len = chunk_size
		}
		if pos+chunk_len < len(encoded) {
			fmt.Print("m=1")
		}
		fmt.Printf(";%s\033\\", encoded[pos:pos+chunk_len])
		pos += chunk_len
	}
	fmt.Print("\033[u")
}
