package controllers

import (
	"encoding/json"
	"eta/eta_chart_lib/models"
	"eta/eta_chart_lib/models/request"
	"eta/eta_chart_lib/models/response"
	"eta/eta_chart_lib/services/data"
	"eta/eta_chart_lib/services/data/table"
	"eta/eta_chart_lib/services/excel"
	"eta/eta_chart_lib/utils"
	"fmt"
	"time"
)

// ExcelInfoController excel表格
type ExcelInfoController struct {
	BaseAuthController
}

// GetTableDetail
// @Title 获取表格表详情
// @Description 获取表格表详情接口
// @Param   UniqueCode   query   string  true       "表格表唯一编码,如果是管理后台访问,传固定字符串:7c69b590249049942070ae9dcd5bf6dc"
// @Success 200 {object} response.ExcelTableDetailResp
// @router /detail [get]
func (this *ExcelInfoController) GetTableDetail() {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()

	uniqueCode := this.GetString("UniqueCode")
	if uniqueCode == "" {
		br.Msg = "参数错误"
		br.ErrMsg = "参数错误,uniqueCode is empty"
		return
	}
	key := utils.HZ_CHART_LIB_EXCEL_TABLE_DETAIL + ":" + uniqueCode
	resp := new(response.ExcelTableDetailResp)
	//判断是否有缓存
	if utils.Re == nil {
		if utils.Re == nil && utils.Rc.IsExist(key) {
			if data, err1 := utils.Rc.RedisBytes(key); err1 == nil {
				err := json.Unmarshal(data, &resp)
				if err == nil && resp != nil {
					br.Ret = 200
					br.Success = true
					br.Msg = "获取成功"
					br.Data = resp
					fmt.Println("source redis")
					return
				}
			}
		}
	}

	excelInfo, err := models.GetExcelInfoByUniqueCode(uniqueCode)
	if err != nil {
		if err.Error() == utils.ErrNoRow() {
			br.Msg = "该表格已被删除,请刷新页面"
			br.ErrMsg = "该表格已被删除,请刷新页面,Err:" + err.Error()
			return
		}
		br.Msg = "获取失败"
		br.ErrMsg = "获取表格表信息失败,Err:" + err.Error()
		return
	}
	var tableData excel.TableData
	switch excelInfo.Source {
	case utils.EXCEL_DEFAULT:
		luckySheetData, err := excel.GetLuckySheetData(excelInfo.Content)
		if err != nil {
			br.Msg = "获取失败"
			br.ErrMsg = "获取excel数据失败,Err:" + err.Error()
			return
		}
		tableData, err = luckySheetData.GetTableDataByLuckySheetDataStr()
		if err != nil {
			br.Msg = "获取失败"
			br.ErrMsg = "转换成table失败,Err:" + err.Error()
			return
		}
	case utils.TIME_TABLE:
		var tableDataConfig data.TableDataConfig
		err = json.Unmarshal([]byte(excelInfo.Content), &tableDataConfig)
		if err != nil {
			br.Msg = "获取失败"
			br.ErrMsg = "表格json转结构体失败,Err:" + err.Error()
			return
		}
		result, err := data.GetDataByTableDataConfig(tableDataConfig)
		if err != nil {
			br.Msg = "获取失败"
			br.ErrMsg = "获取最新的表格数据失败,Err:" + err.Error()
			return
		}
		tableData, err = excel.GetTableDataByCustomData(excelInfo.ExcelType, result)
		if err != nil {
			br.Msg = "获取失败"
			br.ErrMsg = "转换成table失败,Err:" + err.Error()
			return
		}
	case utils.MIXED_TABLE:
		var result request.MixedTableReq
		err = json.Unmarshal([]byte(excelInfo.Content), &result)
		if err != nil {
			br.Msg = "获取失败"
			br.ErrMsg = "表格json转结构体失败,Err:" + err.Error()
			return
		}
		newResult, tmpErr, tmpErrMsg := table.GetMixedTableCellData(result)
		if tmpErr != nil {
			br.Msg = "获取失败"
			if tmpErrMsg != `` {
				br.Msg = tmpErrMsg
			}
			br.ErrMsg = "获取最新的数据失败,Err:" + tmpErr.Error()
			return
		}
		tableData, err = excel.GetTableDataByMixedTableData(newResult)
		if err != nil {
			br.Msg = "获取失败"
			br.ErrMsg = "转换成table失败,Err:" + err.Error()
			return
		}
	}

	tableData = excel.HandleTableCell(tableData)

	resp.TableInfo = tableData
	resp.Source = excelInfo.Source
	resp.ExcelType = excelInfo.ExcelType
	resp.ExcelName = excelInfo.ExcelName
	resp.ExcelImage = excelInfo.ExcelImage
	resp.UniqueCode = excelInfo.UniqueCode

	if utils.Re == nil {
		data, _ := json.Marshal(resp)
		utils.Rc.Put(key, data, 10*time.Minute)
	}
	br.Ret = 200
	br.Success = true
	br.Msg = "获取成功"
	br.Data = resp
}