package logic

import (
	"errors"
	"fmt"
	"server/model/system"
	"server/plugin/common/conver"
	"time"
)

/*
处理影片管理相关业务
*/

type FilmLogic struct {
}

var FL *FilmLogic

//----------------------------------------------------影片管理业务逻辑----------------------------------------------------

// GetFilmPage 获取影片检索信息分页数据
func (fl *FilmLogic) GetFilmPage(s system.SearchVo) []system.SearchInfo {
	// 获取影片检索信息分页数据
	sl := system.GetSearchPage(s)
	return sl
}

// GetSearchOptions 获取影片检索的select的选项options
func (fl *FilmLogic) GetSearchOptions() map[string]any {
	var options = make(map[string]any)
	// 获取分类 options
	tree := system.GetCategoryTree()
	tree.Name = "全部分类"
	options["class"] = conver.ConvertCategoryList(tree)
	options["remarks"] = []map[string]string{{"Name": `全部`, "Value": ``}, {"Name": `完结`, "Value": `完结`}, {"Name": `未完结`, "Value": `未完结`}}
	// 获取 剧情,地区,语言, 年份 组信息 (每个分类对应的检索信息并不相同)
	var tagGroup = make(map[int64]map[string]any)
	// 遍历一级分类获取对应的标签组信息
	for _, t := range tree.Children {
		option := system.GetSearchOptions(t.Id)
		if len(option) > 0 {
			tagGroup[t.Id] = system.GetSearchOptions(t.Id)
			// 如果年份信息不存在则独立一份年份信息
			if _, ok := options["year"]; !ok {
				options["year"] = tagGroup[t.Id]["Year"]
			}
		}

	}
	options["tags"] = tagGroup
	return options
}

// SaveFilmDetail 自定义上传保存影片信息
func (fl *FilmLogic) SaveFilmDetail(fd system.FilmDetailVo) error {
	// 补全影片信息
	now := time.Now()
	fd.UpdateTime = now.Format(time.DateTime)
	fd.AddTime = fd.UpdateTime
	// 生成ID, 由于是自定义上传的影片, 避免和采集站点的影片冲突, 以当前时间时间戳作为ID
	fd.Id = now.Unix()
	// 生成影片详情信息
	detail, err := conver.CovertFilmDetailVo(fd)
	if err != nil || detail.PlayList == nil {
		return errors.New("影片参数格式异常或缺少关键信息")
	}

	// 保存影片信息
	return system.SaveDetail(detail)
}

// DelFilm 删除分类影片
func (fl *FilmLogic) DelFilm(id int64) error {
	// 通过id查询对应影片信息是否存在
	s := system.GetSearchInfoById(id)
	if s == nil {
		return errors.New("影片信息不存在")
	}
	// 通过id删除对应影片信息
	return system.DelFilmSearch(id)
}

//----------------------------------------------------影片分类业务逻辑----------------------------------------------------

// GetFilmClassTree 获取影片分类信息
func (fl *FilmLogic) GetFilmClassTree() system.CategoryTree {
	// 获取原本的影片分类信息
	return system.GetCategoryTree()
}

// GetFilmClassById 通过ID获取影片分类信息
func (fl *FilmLogic) GetFilmClassById(id int64) *system.CategoryTree {
	tree := system.GetCategoryTree()
	for _, c := range tree.Children {
		// 如果是一级分类, 则相等时直接返回
		if c.Id == id {
			return c
		}
		// 如果当前分类含有子分类, 则继续遍历匹配
		if c.Children != nil {
			for _, subC := range c.Children {
				if subC.Id == id {
					return subC
				}
			}
		}
	}
	return nil
}

// UpdateClass 更新分类信息
func (fl *FilmLogic) UpdateClass(class system.CategoryTree) error {
	// 遍历影片分类信息
	tree := system.GetCategoryTree()
	for _, c := range tree.Children {
		// 如果是一级分类, 则相等时直接修改对应的name和show属性
		if c.Id == class.Id {
			if class.Name != "" {
				c.Name = class.Name
			}
			c.Show = class.Show
			if err := system.SaveCategoryTree(&tree); err != nil {
				return fmt.Errorf("影片分类信息更新失败: %s", err.Error())
			}
			return nil
		}
		// 如果当前分类含有子分类, 则继续遍历匹配
		if c.Children != nil {
			for _, subC := range c.Children {
				if subC.Id == class.Id {
					if class.Name != "" {
						subC.Name = class.Name
					}
					// 如果所属分类为二级分类且show属性进行了变化
					if class.Show {
						// 如果show为ture则将其分类下的影片信息进行恢复
						if err := system.RecoverFilmSearch(class.Id); err != nil {
							return err
						}
					} else {
						// 如果show为false则将其分类下的影片信息进行屏蔽
						if err := system.ShieldFilmSearch(class.Id); err != nil {
							return err
						}
					}
					subC.Show = class.Show
					if err := system.SaveCategoryTree(&tree); err != nil {
						return fmt.Errorf("影片分类信息更新失败: %s", err.Error())
					}
					return nil
				}
			}
		}
	}
	return errors.New("需要更新的分类信息不存在")
}

// DelClass 删除分类信息
func (fl *FilmLogic) DelClass(id int64) error {
	tree := system.GetCategoryTree()
	for i, c := range tree.Children {
		// 如果是一级分类, 则相等时直接返回
		if c.Id == id {
			tree.Children = append(tree.Children[:i], tree.Children[i+1:]...)
			if err := system.SaveCategoryTree(&tree); err != nil {
				return fmt.Errorf("影片分类信息删除失败: %s", err.Error())
			}
			return nil
		}
		// 如果当前分类含有子分类, 则继续遍历匹配
		if c.Children != nil {
			for j, subC := range c.Children {
				if subC.Id == id {
					c.Children = append(c.Children[:j], c.Children[j+1:]...)
					if err := system.SaveCategoryTree(&tree); err != nil {
						return fmt.Errorf("影片分类信息删除失败: %s", err.Error())
					}
					return nil
				}
			}
		}
	}
	return errors.New("需要删除的分类信息不存在")
}
