package controller

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"server/logic"
	"server/model/system"
	"server/plugin/spider"
	"strconv"
	"time"
)

// FilmSearchPage 获取影视分页数据
func FilmSearchPage(c *gin.Context) {
	var s = system.SearchVo{Paging: &system.Page{}}
	var err error
	// 检索参数
	s.Name = c.DefaultQuery("name", "")
	s.Pid, err = strconv.ParseInt(c.DefaultQuery("pid", "0"), 10, 64)
	if err != nil {
		system.Failed("影片分页数据获取失败, 请求参数异常", c)
		return
	}
	s.Cid, err = strconv.ParseInt(c.DefaultQuery("cid", "0"), 10, 64)
	if err != nil {
		system.Failed("影片分页数据获取失败, 请求参数异常", c)
		return
	}
	s.Plot = c.DefaultQuery("plot", "")
	s.Area = c.DefaultQuery("area", "")
	s.Language = c.DefaultQuery("language", "")
	year := c.DefaultQuery("year", "")
	if year == "" {
		s.Year = 0
	} else {
		s.Year, err = strconv.ParseInt(year, 10, 64)
		if err != nil {
			system.Failed("影片分页数据获取失败, 请求参数异常", c)
			return
		}
	}

	s.Remarks = c.DefaultQuery("remarks", "")
	// 处理时间参数
	begin := c.DefaultQuery("beginTime", "")
	if begin == "" {
		s.BeginTime = 0
	} else {
		beginTime, e := time.ParseInLocation(time.DateTime, begin, time.Local)
		if e != nil {
			system.Failed("影片分页数据获取失败, 请求参数异常", c)
			return
		}
		s.BeginTime = beginTime.Unix()
	}
	end := c.DefaultQuery("endTime", "")
	if end == "" {
		s.EndTime = 0
	} else {
		endTime, e := time.ParseInLocation(time.DateTime, end, time.Local)
		if e != nil {
			system.Failed("影片分页数据获取失败, 请求参数异常", c)
			return
		}
		s.EndTime = endTime.Unix()
	}

	// 分页参数
	s.Paging.Current, err = strconv.Atoi(c.DefaultQuery("current", "1"))
	s.Paging.PageSize, err = strconv.Atoi(c.DefaultQuery("pageSize", "10"))
	// 如果分页数据超出指定范围则设置为默认值
	if s.Paging.PageSize <= 0 || s.Paging.PageSize > 500 {
		s.Paging.PageSize = 10
	}
	if err != nil {
		system.Failed("影片分页数据获取失败, 请求参数异常", c)
		return
	}
	// 提供检索tag options
	options := logic.FL.GetSearchOptions()
	// 检索条件
	sl := logic.FL.GetFilmPage(s)
	system.Success(gin.H{
		"params":  s,
		"list":    sl,
		"options": options,
	}, "影片分页信息获取成功", c)
}

// FilmAdd 手动添加影片
func FilmAdd(c *gin.Context) {
	// 获取请求参数
	var fd = system.FilmDetailVo{}
	if err := c.ShouldBindJSON(&fd); err != nil {
		system.Failed("影片添加失败, 影片参数提交异常", c)
		return
	}

	// 如果绑定成功则执行影片信息处理保存逻辑
	if err := logic.FL.SaveFilmDetail(fd); err != nil {
		system.Failed(fmt.Sprint("影片添加失败, 影片信息保存错误: ", err.Error()), c)
		return
	}
	system.SuccessOnlyMsg("影片信息添加成功", c)
}

// FilmDelete 删除影片检索信息, 逻辑删除
func FilmDelete(c *gin.Context) {
	// 获取影片ID
	idStr := c.DefaultQuery("id", "")
	if idStr == "" {
		system.Failed("删除失败,缺少ID参数", c)
		return
	}
	id, err := strconv.ParseInt(idStr, 10, 64)
	if err != nil {
		system.Failed("删除失败,参数类型异常", c)
		return
	}
	// 通过ID删除对应影片检索信息
	if err = logic.FL.DelFilm(id); err != nil {
		system.Failed(fmt.Sprintln("删除失败: ", err.Error()), c)
		return
	}
	system.SuccessOnlyMsg("影片删除成功", c)
}

//----------------------------------------------------影片分类处理----------------------------------------------------

// FilmClassTree 影片分类树数据
func FilmClassTree(c *gin.Context) {
	// 获取影片分类树信息
	tree := logic.FL.GetFilmClassTree()
	system.Success(tree, "影片分类信息获取成功", c)
	return
}

// FindFilmClass 获取指定ID对应的影片分类信息
func FindFilmClass(c *gin.Context) {
	idStr := c.DefaultQuery("id", "")
	if idStr == "" {
		system.Failed("影片分类信息获取失败, 分类Id不能为空", c)
		return
	}
	// 转化id类型为int
	id, err := strconv.ParseInt(idStr, 10, 64)
	if err != nil {
		system.Failed("影片分类信息获取失败, 参数分类Id格式异常", c)
		return
	}
	// 通过Id返回对应的分类信息
	class := logic.FL.GetFilmClassById(id)
	if class == nil {
		system.Failed("影片分类信息获取失败, 分类信息不存在", c)
		return
	}
	system.Success(class, "分类信息查找成功", c)
}

// UpdateFilmClass 更新指定分类的影片数据
func UpdateFilmClass(c *gin.Context) {
	// 获取修改后的分类信息
	var class = system.CategoryTree{}
	if err := c.ShouldBindJSON(&class); err != nil {
		system.Failed("更新失败, 请求参数异常", c)
		return
	}
	if class.Id == 0 {
		system.Failed("更新失败, 分类Id缺失", c)
		return
	}
	// 修改分类信息
	if err := logic.FL.UpdateClass(class); err != nil {
		system.Failed(err.Error(), c)
		return
	}
	// 更新成功后删除首页缓存
	spider.ClearCache()
	system.SuccessOnlyMsg("影片分类信息更新成功", c)
}

// DelFilmClass 删除指定ID对应的影片分类
func DelFilmClass(c *gin.Context) {
	idStr := c.DefaultQuery("id", "")
	if idStr == "" {
		system.Failed("影片分类信息获取失败, 分类Id不能为空", c)
		return
	}
	// 转化id类型为int
	id, err := strconv.ParseInt(idStr, 10, 64)
	if err != nil {
		system.Failed("影片分类信息获取失败, 参数分类Id格式异常", c)
		return
	}
	// 通过ID删除对应分类信息
	if err = logic.FL.DelClass(id); err != nil {
		system.Failed(err.Error(), c)
		return
	}
	system.SuccessOnlyMsg("当前分类已删除成功", c)
}
