package excel

import (
	"fmt"
	"image/png"
	"os"
)

func (d *MExcel) CreateBmp(pngFilePath string, dstFilePath string, cmd string) {
	defer func() {
		d.ChOneTaskFinished <- true
	}()
	// png
	src, err := os.Open(pngFilePath)
	if err != nil {
		return
	}
	defer func() {
		if err := src.Close(); err != nil {
			fmt.Println(err)
		}
	}()

	pngImg, err := png.Decode(src)
	if err != nil {
		return
	}

	// bmp
	stradd := ""
	if cmd == "CHL" {
		stradd = "_CHL.bmp"
	} else {
		stradd = "_RCL.bmp"
	}
	dst, err := os.Create(dstFilePath[:len(dstFilePath)-4] + stradd)
	if err != nil {
		return
	}
	defer func() {
		if err := dst.Close(); err != nil {
			fmt.Println(err)
		}
	}()

	var w, h uint16
	if cmd == "CHL" {
		w = d.GetCHLWidth()
		h = d.GetCHLHeight()
	} else if cmd == "RCL" {
		w = d.GetRCLWidth()
		h = d.GetRCLHeight()
	} else {
		w = 0
		h = 0
	}
	numOfAddZero := 4 - w*3%4
	sizeOfOneLine := w*3 + numOfAddZero
	len := (w*3 + numOfAddZero) * h
	buf := make([]byte, len)
	for k, _ := range buf {
		// align this area with 0, other area with 0x64
		if (k+1)%int(sizeOfOneLine) == 0 {
			buf[k-1] = 0
			buf[k] = 0
		} else {
			buf[k] = 0x64
		}
	}

	// fill header
	head := make([]byte, 0x36)
	head[0] = 0x42
	head[1] = 0x4d

	tmp := sizeOfOneLine*h + 0x36
	head[2] = byte(tmp)
	head[3] = byte(tmp >> 8)
	head[4] = byte(tmp >> 16)
	head[5] = byte(tmp >> 24)

	head[0x0a] = 0x36
	head[0x0e] = 0x28

	head[0x12] = byte(w)
	head[0x13] = byte(w >> 8)
	head[0x14] = byte(w >> 16)
	head[0x15] = byte(w >> 24)

	head[0x16] = byte(h)
	head[0x17] = byte(h >> 8)
	head[0x18] = byte(h >> 16)
	head[0x19] = byte(h >> 24)

	head[0x1a] = 0x01
	head[0x1c] = 0x18
	head[0x26] = 0xc4
	head[0x27] = 0x0e
	head[0x2a] = 0xc4
	head[0x2b] = 0x0e

	// write data to bmp image
	var data []*MImgPointInfo
	if cmd == "CHL" {
		data = d.CHLBmpData.ImgInfo
	} else {
		data = d.RCLBmpData.ImgInfo
	}
	for _, v := range data {
		// HB is not use in animation
		if v.SrcX == 0 && v.SrcY == 0 {
			continue
		}
		color := pngImg.At(int(v.SrcX), int(v.SrcY))
		r, g, b, _ := color.RGBA()
		// only use the max pixel vale, if else, set to 0
		if r > g && r > b {
			buf[(w*3+numOfAddZero)*(h-1-v.DstY)+3*v.DstX] = byte(0)
			buf[(w*3+numOfAddZero)*(h-1-v.DstY)+3*v.DstX+1] = byte(0)
			buf[(w*3+numOfAddZero)*(h-1-v.DstY)+3*v.DstX+2] = byte(r)
		} else if g > r && g > b {
			buf[(w*3+numOfAddZero)*(h-1-v.DstY)+3*v.DstX] = byte(0)
			buf[(w*3+numOfAddZero)*(h-1-v.DstY)+3*v.DstX+1] = byte(g)
			buf[(w*3+numOfAddZero)*(h-1-v.DstY)+3*v.DstX+2] = byte(0)
		} else if b > r && b > g {
			buf[(w*3+numOfAddZero)*(h-1-v.DstY)+3*v.DstX] = byte(b)
			buf[(w*3+numOfAddZero)*(h-1-v.DstY)+3*v.DstX+1] = byte(0)
			buf[(w*3+numOfAddZero)*(h-1-v.DstY)+3*v.DstX+2] = byte(0)
		} else {
			buf[(w*3+numOfAddZero)*(h-1-v.DstY)+3*v.DstX] = byte(0)
			buf[(w*3+numOfAddZero)*(h-1-v.DstY)+3*v.DstX+1] = byte(0)
			buf[(w*3+numOfAddZero)*(h-1-v.DstY)+3*v.DstX+2] = byte(0)
		}
	}
	head = append(head, buf...)
	_, err = dst.Write(head)
	if err != nil {
		return
	}
}
