package data_source

import (
	"eta/eta_api/controllers"
	"eta/eta_api/models"
	"eta/eta_api/models/data_source"
	"eta/eta_api/utils"
	"fmt"
	"github.com/tealeg/xlsx"
	"os"
	"path/filepath"
	"strconv"
	"time"
)

type DataSourceController struct {
	controllers.BaseAuthController
}

// ComTradeCountryList
// @Title 获取广州期货交易所分类
// @Description 获取广州期货交易所分类
// @Success 200 {object} []data_manage.ComTradeCountryItem
// @router /gfex/classify/list [get]
func (this *DataSourceController) GfexClassifyList() {
	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
	}

	gzqhObj := new(data_source.BaseFromTradeGuangzhouIndex)
	classifyList, err := gzqhObj.GetBaseFromTradeGuangzhouClassifyAll()
	if err != nil {
		br.Msg = "获取分类失败"
		br.ErrMsg = "获取分类失败,Err:" + err.Error()
		return
	}

	classifyMap := make(map[int][]*data_source.BaseFromTradeGuangzhouClassifyView)
	for _, v := range classifyList {
		if v.ParentId == 0 {
			continue
		}
		if items, ok := classifyMap[v.ParentId]; !ok {
			list := make([]*data_source.BaseFromTradeGuangzhouClassifyView, 0)
			list = append(list, v)
			classifyMap[v.ParentId] = list
		} else {
			items = append(items, v)
			classifyMap[v.ParentId] = items
		}
	}

	classifyItems := make([]*data_source.BaseFromTradeGuangzhouClassifyView, 0)
	for _, v := range classifyList {
		if v.ParentId == 0 {
			v.Children = classifyMap[v.BaseFromTradeGuangzhouClassifyId]
			classifyItems = append(classifyItems, v)
		}
	}

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

// ComTradeCountryList
// @Title 获取广州期货交易所数据最大日期
// @Description 获取广州期货交易所数据最大日期
// @Success 200 {object} []data_source.ComTradeCountryItem
// @router /gfex/max/date [get]
func (this *DataSourceController) GfexMaxDate() {
	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
	}

	gzqhObj := new(data_source.BaseFromTradeGuangzhouIndex)
	maxDate, err := gzqhObj.GetBaseFromTradeGuangzhouMaxDate()
	if err != nil {
		br.ErrMsg = "获取最新日期失败,Err:" + err.Error()
		br.Msg = "获取最新日期失败"
		return
	}
	br.Ret = 200
	br.Success = true
	br.Msg = "获取成功"
	br.Data = maxDate
}

// ComTradeCountryList
// @Title 获取广州期货交易所-分类下合约
// @Description 获取广州期货交易所-分类下合约
// @Param   BaseFromTradeGuangzhouClassifyId   query   int  true       "分类id"
// @Param   TradeDate   query   string  true       "日期"
// @Success 200 {object} []data_source.BaseFromTradeGuangzhouContract
// @router /gfex/contract [get]
func (this *DataSourceController) GfexContract() {
	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
	}

	baseFromTradeGuangzhouClassifyId, _ := this.GetInt("BaseFromTradeGuangzhouClassifyId", 0)
	if baseFromTradeGuangzhouClassifyId <= 0 {
		br.Msg = "参数错误"
		br.Msg = "分类id错误"
		return
	}
	tradeDate := this.GetString("TradeDate")
	if tradeDate == "" {
		br.Msg = "参数错误"
		br.Msg = "交易日期不能为空"
		return
	}
	gzqhObj := new(data_source.BaseFromTradeGuangzhouIndex)
	list, err := gzqhObj.GetBaseFromTradeGuangzhouContract(baseFromTradeGuangzhouClassifyId, tradeDate)
	if err != nil {
		br.ErrMsg = "获取数据失败,Err:" + err.Error()
		br.Msg = "获取数据失败"
		return
	}
	br.Ret = 200
	br.Success = true
	br.Msg = "获取成功"
	br.Data = list
}

// ComTradeCountryList
// @Title 获取广州期货交易所-分类下指标信息
// @Description 获取广州期货交易所-分类下指标信息
// @Param   BaseFromTradeGuangzhouClassifyId   query   int  true       "分类id"
// @Param   BaseFromTradeGuangzhouContractId   query   int  true       "合约id"
// @Param   TradeDate   query   string  true       "日期"
// @Success 200 {object} []data_source.BaseFromTradeGuangzhouIndexView
// @router /gfex/index_data [get]
func (this *DataSourceController) GfexIndexData() {
	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
	}

	baseFromTradeGuangzhouClassifyId, _ := this.GetInt("BaseFromTradeGuangzhouClassifyId", 0)
	if baseFromTradeGuangzhouClassifyId <= 0 {
		br.Msg = "参数错误"
		br.ErrMsg = "分类id错误"
		return
	}
	tradeDate := this.GetString("TradeDate")
	if tradeDate == "" {
		br.Msg = "参数错误"
		br.ErrMsg = "交易日期不能为空"
		return
	}
	baseFromTradeGuangzhouContractId, err := this.GetInt("BaseFromTradeGuangzhouContractId", 0)
	fmt.Println(err)
	fmt.Println(baseFromTradeGuangzhouContractId)

	var condition string
	var pars []interface{}

	if baseFromTradeGuangzhouContractId > 0 {
		condition += `  b.data_time=? `
		pars = append(pars, tradeDate)
		condition += ` AND a.base_from_trade_guangzhou_classify_id=? `
		pars = append(pars, baseFromTradeGuangzhouClassifyId)
	} else {
		if baseFromTradeGuangzhouClassifyId == 11 || baseFromTradeGuangzhouClassifyId == 12 { //月度数据处理
			td, err := time.Parse(utils.FormatDate, tradeDate)
			if err != nil {
				br.Msg = "日期格式错误"
				br.ErrMsg = "日期格式错误,Err:" + err.Error()
				return
			}
			_, monthEndDay := utils.GetMonthStartAndEnd(strconv.Itoa(td.Year()), strconv.Itoa(int(td.Month())))
			condition += `  a.data_time=? `
			pars = append(pars, monthEndDay)
		} else {
			condition += `  a.data_time=? `
			pars = append(pars, tradeDate)
		}

		condition += ` AND b.base_from_trade_guangzhou_classify_id=? `
		pars = append(pars, baseFromTradeGuangzhouClassifyId)
	}

	//if baseFromTradeGuangzhouContractId > 0 {
	//	condition += ` AND c.base_from_trade_guangzhou_contract_id=? `
	//	pars = append(pars, baseFromTradeGuangzhouContractId)
	//}

	gzqhObj := new(data_source.BaseFromTradeGuangzhouIndex)
	list, err := gzqhObj.GetBaseFromTradeGuangzhouIndex(condition, pars, baseFromTradeGuangzhouContractId)
	if err != nil {
		br.ErrMsg = "获取数据失败,Err:" + err.Error()
		br.Msg = "获取数据失败"
		return
	}
	br.Ret = 200
	br.Success = true
	br.Msg = "获取成功"
	br.Data = list
}

// @Title 获取广州期货交易所-一次性交割卖方仓单明细
// @Description 获取广州期货交易所-一次性交割卖方仓单明细
// @Param   BaseFromTradeGuangzhouIndexId   query   int  true       "指标id"
// @Param   TradeDate   query   string  true       "日期"
// @Success 200 {object} []data_source.BaseFromTradeGuangzhouIndexView
// @router /gfex/index/detail [get]
func (this *DataSourceController) GfexIndexDetail() {
	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
	}
	baseFromTradeGuangzhouIndexId, _ := this.GetInt("BaseFromTradeGuangzhouIndexId", 0)
	if baseFromTradeGuangzhouIndexId < 0 {
		br.Msg = "参数错误"
		return
	}
	tradeDate := this.GetString("TradeDate")
	if tradeDate == "" {
		br.Msg = "参数错误"
		br.ErrMsg = "交易日期不能为空"
		return
	}

	var condition string
	var pars []interface{}

	condition += ` a.base_from_trade_guangzhou_classify_id = ? `
	pars = append(pars, baseFromTradeGuangzhouIndexId)

	td, err := time.Parse(utils.FormatDate, tradeDate)
	if err != nil {
		br.Msg = "日期格式错误"
		br.ErrMsg = "日期格式错误,Err:" + err.Error()
		return
	}
	_, monthEndDay := utils.GetMonthStartAndEnd(strconv.Itoa(td.Year()), strconv.Itoa(int(td.Month())))
	condition += ` AND a.end_date = ? `
	pars = append(pars, monthEndDay)

	gzqhObj := new(data_source.BaseFromTradeGuangzhouIndex)
	list, err := gzqhObj.GetBaseFromTradeGuangzhouIndexDetail(condition, pars)
	if err != nil {
		br.ErrMsg = "获取数据失败,Err:" + err.Error()
		br.Msg = "获取数据失败"
		return
	}
	br.Ret = 200
	br.Success = true
	br.Msg = "获取成功"
	br.Data = list
}

// @Title 导出广州期货交易所-一次性交割卖方仓单明细
// @Description 导出广州期货交易所-一次性交割卖方仓单明细
// @Param   BaseFromTradeGuangzhouIndexId   query   int  true       "指标id"
// @Param   TradeDate   query   string  true       "日期"
// @Success 200  导出成功
// @router /gfex/index/detail/export [get]
func (this *DataSourceController) ExportGfexIndexDetail() {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()

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

	baseFromTradeGuangzhouIndexId, _ := this.GetInt("BaseFromTradeGuangzhouIndexId", 0)
	if baseFromTradeGuangzhouIndexId < 0 {
		br.Msg = "参数错误"
		return
	}
	tradeDate := this.GetString("TradeDate")
	if tradeDate == "" {
		br.Msg = "参数错误"
		br.ErrMsg = "交易日期不能为空"
		return
	}

	var condition string
	var pars []interface{}

	condition += ` a.base_from_trade_guangzhou_classify_id = ? `
	pars = append(pars, baseFromTradeGuangzhouIndexId)

	td, err := time.Parse(utils.FormatDate, tradeDate)
	if err != nil {
		br.Msg = "日期格式错误"
		br.ErrMsg = "日期格式错误,Err:" + err.Error()
		return
	}
	_, monthEndDay := utils.GetMonthStartAndEnd(strconv.Itoa(td.Year()), strconv.Itoa(int(td.Month())))
	condition += ` AND a.end_date = ? `
	pars = append(pars, monthEndDay)

	gzqhObj := new(data_source.BaseFromTradeGuangzhouIndex)
	list, err := gzqhObj.GetBaseFromTradeGuangzhouIndexDetail(condition, pars)
	if err != nil {
		br.ErrMsg = "获取数据失败,Err:" + err.Error()
		br.Msg = "获取数据失败"
		return
	}

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

	downLoadnFilePath := exPath + "/" + time.Now().Format(utils.FormatDateTimeUnSpace) + ".xlsx"
	xlsxFile := xlsx.NewFile()
	sheetNew, err := xlsxFile.AddSheet("详情")
	if err != nil {
		br.ErrMsg = "导出失败,Err:" + err.Error()
		br.Msg = "导出失败"
		return
	}
	titleRow := sheetNew.AddRow()
	titleRow.AddCell().SetValue("指标ID")
	titleRow.AddCell().SetValue("指标名称")
	titleRow.AddCell().SetValue("数值")
	titleRow.AddCell().SetValue("单位")
	titleRow.AddCell().SetValue("频度")
	titleRow.AddCell().SetValue("起始日期")
	titleRow.AddCell().SetValue("最新日期")

	var indexCode string
	for _, sv := range list {
		dataRow := sheetNew.AddRow()
		dataRow.AddCell().SetValue(sv.IndexCode)
		dataRow.AddCell().SetValue(sv.IndexName)
		dataRow.AddCell().SetValue(sv.Value)
		dataRow.AddCell().SetValue(sv.Unit)
		dataRow.AddCell().SetValue(sv.Frequency)
		dataRow.AddCell().SetValue(sv.StartDate)
		dataRow.AddCell().SetValue(sv.EndDate)

		indexCode = sv.IndexCode
	}
	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 := `一次性交割卖方仓单详情`
	fileName = indexCode[:6] + fileName + `.xlsx` //文件名称
	this.Ctx.Output.Download(downLoadnFilePath, fileName)
	defer func() {
		os.Remove(downLoadnFilePath)
	}()
	br.Ret = 200
	br.Success = true
	br.Msg = "success"

}