package xmlres

import (
	"blazing/common/utils"
	"os"

	"github.com/ECUST-XX/xml"
	"github.com/gogf/gf/v2/os/gctx"
	"github.com/gogf/gf/v2/os/gfile"
	"github.com/gogf/gf/v2/os/gfsnotify"
	"github.com/gogf/gf/v2/os/glog"
	"github.com/gogf/gf/v2/util/gconv"
)

var path string

func getXml[T any](path string) T {

	// 解析XML到结构体
	var xmls T
	t1 := gfile.GetBytes(path)
	xml.Unmarshal(t1, &xmls)

	return xmls
}

var (
	MapConfig   Maps      //地图配置
	ItemsConfig Items     //物品配置
	TalkConfig  TalkCount //任务配置
	//Monster     MonsterRoot //野怪配置
	MonsterMap map[int]TMapConfig
	//Skill      MovesTbl //技能配置
	SkillMap        map[int]Move
	PetMAP          map[int]PetInfo //宠物配置
	NatureRootMap   map[int]NatureItem
	EffectMAP       map[int]NewSeIdx
	PlayerEffectMAP map[int]NewSeIdx
	ItemsMAP        map[int]Item
)

func initfile() {
	path1, _ := os.Getwd()
	path = path1 + "/public/config/"
	MapConfig = getXml[Maps](path + "210.xml")
	ItemsConfig = getXml[Items](path + "43.xml")

	ItemsMAP = utils.ToMap[Item, int](ItemsConfig.Items, func(m Item) int {
		return m.ID

	})

	TalkConfig = getXml[TalkCount](path + "talk.xml")
	Monster := getXml[MonsterRoot](path + "地图配置野怪.xml")

	MonsterMap = utils.ToMap(Monster.Maps, func(m TMapConfig) int {
		return m.ID

	})

	Skill := getXml[MovesTbl](path + "227.xml")

	SkillMap = make(map[int]Move, len(Skill.Moves))
	for _, v := range Skill.Moves {
		v.SideEffectS = ParseSideEffectArgs(v.SideEffect)
		v.SideEffectArgS = ParseSideEffectArgs(v.SideEffectArg)
		SkillMap[v.ID] = v
	}

	pet := getXml[Monsters](path + "226.xml")
	PetMAP = utils.ToMap[PetInfo, int](pet.Monsters, func(m PetInfo) int {
		return m.ID

	})
	NatureRootMap1 := getXml[NatureRoot](path + "nature.xml")

	NatureRootMap = utils.ToMap[NatureItem, int](NatureRootMap1.Items, func(m NatureItem) int {
		return m.ID

	})
	EffectMAP1 := getXml[NewSe](path + "bossbuff和特性.xml")
	EffectMAP = make(map[int]NewSeIdx, len(EffectMAP1.SeIdxList))
	for _, v := range EffectMAP1.SeIdxList {
		v.ArgsS = ParseSideEffectArgs(v.Args)

		EffectMAP[gconv.Int(v.Idx)] = v
	}
	PlayerEffectMAP = make(map[int]NewSeIdx)
	for _, v := range EffectMAP1.SeIdxList {
		if gconv.Int(v.Stat) == 1 && gconv.Int(v.StarLevel) == 0 {
			v.ArgsS = ParseSideEffectArgs(v.Args)

			PlayerEffectMAP[gconv.Int(v.Idx)] = v
		}

	}

}

func init() {

	initfile() //先初始化一次

	go func() {

		if !gfile.Exists(path) {
			fileHandle, _ := gfile.Create(path)
			fileHandle.Close()
		}

		//updatersares()
		ctx := gctx.New()
		_, err := gfsnotify.Add(path, func(event *gfsnotify.Event) {
			if event.IsCreate() {
				glog.Debug(ctx, "创建文件 : ", event.Path)
			}
			if event.IsWrite() {
				glog.Debug(ctx, "写入文件 : ", event.Path)
				initfile() //先初始化一次
			}
			if event.IsRemove() {
				glog.Debug(ctx, "删除文件 : ", event.Path)
			}
			if event.IsRename() {
				glog.Debug(ctx, "重命名文件 : ", event.Path)
			}
			if event.IsChmod() {
				glog.Debug(ctx, "修改权限 : ", event.Path)
			}
			glog.Debug(ctx, event)
		}, true)

		if err != nil {
			glog.Fatal(ctx, err)
		} else {
			select {}
		}
	}()

}
