package data_manage

import (
	"github.com/rdlucklib/rdluck_tools/paging"
	"github.com/tealeg/xlsx"
	"eta/eta_api/models"
	"eta/eta_api/models/data_manage"
	"eta/eta_api/utils"
	"os"
	"path/filepath"
	"time"
)

// EiaSteoClassify
// @Title EiaSteo数据分类
// @Description EiaSteo数据分类接口
// @Success 200 {object} data_manage.LzClassify
// @router /eia_steo/classify [get]
func (this *EdbInfoController) EiaSteoClassify() {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()
	sysUser := this.SysUser
	if sysUser == nil {
		br.Msg = "请登录"
		br.ErrMsg = "请登录,SysUser Is Empty"
		br.Ret = 408
		return
	}
	classifyList, err := data_manage.GetEiaSteoClassifyList()
	if err != nil {
		br.Msg = "获取分类失败"
		br.ErrMsg = "获取分类失败,Err:" + err.Error()
		return
	}
	for _, v := range classifyList {
		if v.ClassifyName == `` {
			v.ClassifyName = v.ClassifyNameOriginal
		}
	}

	br.Ret = 200
	br.Success = true
	br.Msg = "获取成功"
	br.Data = classifyList
}

// EiaSteoData
// @Title 获取EiaSteo数据
// @Description 获取EiaSteo数据接口
// @Param   BaseFromEiaSteoClassifyId   query   int  true       "指标分类id"
// @Param   IndexCode   query   string  true       "指标code"
// @Param   IsExport   query   bool  false       "是否导出excel,默认是false"
// @Param   PageSize   query   int  true       "每页数据条数"
// @Param   CurrentIndex   query   int  true       "当前页页码,从1开始"
// @Success 200 {object} data_manage.LzFrequency
// @router /eia_steo/data [get]
func (this *EdbInfoController) EiaSteoData() {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()
	sysUser := this.SysUser
	if sysUser == nil {
		br.Msg = "请登录"
		br.ErrMsg = "请登录,SysUser Is Empty"
		br.Ret = 408
		return
	}
	pageSize, _ := this.GetInt("PageSize")
	currentIndex, _ := this.GetInt("CurrentIndex")
	var startSize int
	//是否导出报表
	isExport, _ := this.GetBool("IsExport")
	if isExport {
		pageSize = 10000
		currentIndex = 1
	}

	if pageSize <= 0 {
		pageSize = utils.PageSize20
	}
	if currentIndex <= 0 {
		currentIndex = 1
	}
	startSize = utils.StartIndex(currentIndex, pageSize)

	var condition string
	var pars []interface{}

	indexCode := this.GetString("IndexCode")
	if indexCode != "" {
		condition += ` AND index_code = ? `
		pars = append(pars, utils.TrimStr(indexCode))
	}
	classifyId, _ := this.GetInt("BaseFromEiaSteoClassifyId")
	if classifyId > 0 {
		condition += ` AND base_from_eia_steo_classify_id = ? `
		pars = append(pars, classifyId)
	}

	//获取指标
	indexList, err := data_manage.GetEiaSteoIndexList(condition, pars)
	if err != nil {
		br.Msg = "获取数据失败"
		br.ErrMsg = "获取数据失败,Err:" + err.Error()
		return
	}
	resultList := make([]data_manage.EiaSteoIndexListResp, 0)
	for _, v := range indexList {

		indexName := v.IndexName
		if indexName == `` {
			indexName = v.IndexNameOriginal
		}
		product := data_manage.EiaSteoIndexListResp{
			BaseFromEiaSteoIndexId:    v.BaseFromEiaSteoIndexId,
			BaseFromEiaSteoClassifyId: v.BaseFromEiaSteoClassifyId,
			IndexCode:                 v.IndexCode,
			IndexName:                 indexName,
			//IndexNameOriginal:          v.IndexNameOriginal,
			Unit:       v.Unit,
			Frequency:  v.Frequency,
			StartDate:  v.StartDate.Format(utils.FormatDate),
			EndDate:    v.EndDate.Format(utils.FormatDate),
			ModifyTime: v.ModifyTime.Format(utils.FormatDateTime),
			CreateTime: v.CreateTime.Format(utils.FormatDateTime),
			//Paging:     tmpPaging,
			//DataList:   nil,
		}

		total, err := data_manage.GetEiaSteoIndexDataCount(v.IndexCode)
		page := paging.GetPaging(currentIndex, pageSize, total)

		dataList, err := data_manage.GetEiaSteoIndexDataList(v.IndexCode, startSize, pageSize)
		if err != nil {
			br.Msg = "获取数据失败"
			br.ErrMsg = "获取指标数据失败,Err:" + err.Error()
			return
		}
		if dataList == nil {
			dataList = make([]*data_manage.BaseFromEiaSteoDataItem, 0)
		}
		product.DataList = dataList
		product.Paging = page
		resultList = append(resultList, product)
	}

	//导出excel
	if isExport {
		EiaSteoDataExport(this, resultList, br)
		return
	}
	br.Ret = 200
	br.Success = true
	br.Msg = "获取成功"
	br.Data = resultList
}

// EiaSteoSearchList
// @Title EiaSteo模糊搜索
// @Description EiaSteo模糊搜索
// @Param   Keyword   query   string  ture       "关键字搜索"
// @Success 200 {object} models.BaseResponse
// @router /eia_steo/search_list [get]
func (this *EdbInfoController) EiaSteoSearchList() {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()

	sysUser := this.SysUser
	if sysUser == nil {
		br.Msg = "请重新登录"
		return
	}

	//关键字
	keyword := this.GetString("Keyword")
	list, err := data_manage.GetEiaSteoItemList(utils.TrimStr(keyword))
	if err != nil {
		br.ErrMsg = "获取失败,Err:" + err.Error()
		br.Msg = "获取失败"
		return
	}

	br.Ret = 200
	br.Success = true
	br.Msg = "获取成功"
	br.Data = list
}

// EiaSteoDataExport 表格导出
func EiaSteoDataExport(this *EdbInfoController, list []data_manage.EiaSteoIndexListResp, br *models.BaseResponse) {
	sysUser := this.SysUser
	if sysUser == nil {
		br.Msg = "请重新登录"
		return
	}

	dir, _ := os.Executable()
	exPath := filepath.Dir(dir)

	downLoadnFilePath := exPath + "/" + time.Now().Format(utils.FormatDateTimeUnSpace) + ".xlsx"
	xlsxFile := xlsx.NewFile()

	sheet, err := xlsxFile.AddSheet("数据报表")

	//获取指标数据
	rowSecName := sheet.AddRow()
	celSecName := rowSecName.AddCell()
	celSecName.SetValue("指标名称")
	rowUnit := sheet.AddRow()
	celUnit := rowUnit.AddCell()
	celUnit.SetValue("单位")

	rowModifyDate := sheet.AddRow()
	rowModifyCell := rowModifyDate.AddCell()
	rowModifyCell.SetValue("更新时间")

	dataMap := make(map[string]map[string]*data_manage.BaseFromEiaSteoDataItem)
	var indexCodeList []string
	for _, v := range list {
		cellSenName := rowSecName.AddCell()
		cellSenName.SetValue(v.IndexName)
		celUnit := rowUnit.AddCell()
		celUnit.SetValue(v.Unit)
		rowModifyCell := rowModifyDate.AddCell()
		rowModifyCell.SetValue(v.ModifyTime)

		indexCodeList = append(indexCodeList, v.IndexCode)

		dataMap[v.IndexCode] = make(map[string]*data_manage.BaseFromEiaSteoDataItem)
		for _, item := range v.DataList {
			dataMap[item.IndexCode][item.DataTime] = item
		}
	}

	dateList, err := data_manage.GetEiaSteoDateList(indexCodeList)
	if err != nil {
		br.Msg = "获取数据失败"
		br.ErrMsg = "获取数据失败,Err:" + err.Error()
		return
	}
	for _, n := range dateList {
		dateStr := n.DataTime //当前日期
		rowData := sheet.AddRow()
		celDate := rowData.AddCell()
		celDate.SetValue(dateStr)

		for _, m := range list {
			celData := rowData.AddCell()
			if dataMap[m.IndexCode][dateStr] != nil {
				celData.SetValue(dataMap[m.IndexCode][dateStr].Value)
			}
		}
	}

	err = xlsxFile.Save(downLoadnFilePath)
	if err != nil {
		//有指标无数据时先导出一遍空表
		sheet, err := xlsxFile.AddSheet("无数据")
		if err != nil {
			br.Msg = "新增Sheet失败"
			br.ErrMsg = "新增Sheet失败,Err:" + err.Error()
			return
		}
		rowSecName := sheet.AddRow()
		celSecName := rowSecName.AddCell()
		celSecName.SetValue("")
		err = xlsxFile.Save(downLoadnFilePath)
		if err != nil {
			br.Msg = "保存文件失败"
			br.ErrMsg = "保存文件失败"
			return
		}
	}
	fileName := `EiaSteo数据`
	fileName += time.Now().Format("06.01.02") + `.xlsx` //文件名称
	this.Ctx.Output.Download(downLoadnFilePath, fileName)
	defer func() {
		os.Remove(downLoadnFilePath)
	}()
	br.Ret = 200
	br.Success = true
	br.Msg = "success"
}