package main

import (
	"flag"
	"fmt"
	"github.com/ftrvxmtrx/tga"
	"image"
	"image/color"
	"image/draw"
	"image/png"
	"os"
	"path/filepath"
)

func main() {

	input := flag.String("i", "", "input files glob pattern")
	output := flag.String("o", "merge%04d.png", "output files name mask")
	merge := flag.Int("m", 0, "number of frames to be merged")
	overlap := flag.Int("b", 0, "number of frames to be overlapped")

	flag.Parse()

	if *input == "" || *merge < 1 || *overlap < 0 {
		flag.Usage()
		os.Exit(2)
	}

	files, e := filepath.Glob(*input)

	if e != nil {
		panic(e)
	}

	if len(files) < *merge {
		fmt.Fprint(os.Stderr, "no (or not enough) input files found")
		os.Exit(3)
	}

	encoder := &png.Encoder{
		CompressionLevel: png.NoCompression,
	}

	buffer := make([]image.Image, *merge+*overlap*2)

	w := -1
	h := -1
	f := 0

	for i := 0; i < len(files); i++ {

		file, e := os.Open(files[i])

		if e != nil {
			panic(e)
		}

		c, e := tga.DecodeConfig(file)

		if e != nil {
			panic(e)
		}

		fmt.Printf("decoded: %s\n", file.Name())

		if w == -1 {
			w = c.Width
			h = c.Height
		}

		if w != c.Width || h != c.Height {
			fmt.Fprint(os.Stderr, "incorrect frame size\n")
			os.Exit(4)
		}

		_, _ = file.Seek(0, 0)

		frame, e := tga.Decode(file)

		if e != nil {
			panic(e)
		}

		e = file.Close()

		if e != nil {
			panic(e)
		}

		if i >= *merge+*overlap*2 {

			for j := 0; j < *merge+*overlap*2-1; j++ {
				buffer[j] = buffer[j+1]
			}

		}

		if i < *merge+*overlap*2 {
			buffer[i] = frame
		} else {
			buffer[*merge+*overlap*2-1] = frame
		}

		if i+1 < *merge+*overlap*2 || (i+*overlap*2)%*merge != 0 {
			continue
		}

		merged := image.NewRGBA(buffer[0].Bounds())

		for j := 0; j < len(buffer); j++ {
			mask := image.NewUniform(color.Alpha{A: uint8(255 - j*(255/(*merge+*overlap*2)))})
			draw.DrawMask(merged, buffer[j].Bounds(), buffer[j], image.ZP, mask, image.ZP, draw.Over)
		}

		result, _ := os.Create(fmt.Sprintf(*output, f))
		e = encoder.Encode(result, merged)

		if e != nil {
			panic(e)
		}

		fmt.Printf("encoded: %s\n", result.Name())
		result.Close()

		f++

	}

}