/**
* @Author: zou.yingbin
* @Create  : 2021/4/16 18:40
* @Modify  : 2021/4/16 18:40
 */

package ermcp3

import (
	"github.com/gin-gonic/gin"
	"mtp2_if/global/app"
	"mtp2_if/global/e"
	"mtp2_if/models"
	"net/http"
	"strconv"
)

// 查询日期
type QueryDate string

// IsNumberic 判断是否为数字,
func (v QueryDate) IsNumberic(queryType int32) bool {
	if queryType == 1 {
		// 日报表 日期长度YYYYMMDD
		if len(v) != 8 {
			return false
		}
	} else if queryType == 2 {
		// 月报表 日期长度YYYYMM
		if len(v) != 6 {
			return false
		}
	}
	// 判断是否为数字
	if _, err := strconv.ParseInt(string(v), 10, 32); err != nil {
		return false
	}
	return true
}

// 检查周期类型、周期时间
type CycleTypeCheck struct {
	CYCLETYPE int32  `json:"cycletype"  xorm:"'cycletype'"` // 周期类型 - 1:月 2:季 3:年 4:周 5:全报表【原值】
	CYCLETIME string `json:"cycletime"  xorm:"'cycletime'"` // 周期时间 月(YYYYMM)  季(YYYYQ) 年(YYYY) 周(YYYYIW) 全(0)【原值】
}

func (r *CycleTypeCheck) Check() bool {
	if r.CYCLETYPE < 1 || r.CYCLETYPE > 5 {
		return false
	}
	nLen := len(r.CYCLETIME)
	// 判断是否为数字
	if _, err := strconv.ParseInt(r.CYCLETIME, 10, 32); err != nil {
		return false
	}
	// 判断长度
	switch r.CYCLETYPE {
	case 1:
		if nLen != 6 {
			return false
		}
	case 2:
		if nLen != 5 {
			return false
		}
	case 3:
		if nLen != 4 {
			return false
		}
	case 4:
		if nLen != 6 {
			return false
		}
	case 5:
		if r.CYCLETIME != "0" {
			return false
		}
	}
	return true
}

// @Summary 查询现货日报表详情(菜单:报表查询/现货报表/现货日报表详情)
// @Produce json
// @Security ApiKeyAuth
// @Param userid query int true "用户ID"
// @Param deliverygoodsid query int true "现货商品id"
// @Param tradedate query string true "交易日(格式:yyyyMMdd)"
// @Param wrstandardid query int false "品类ID"
// @Param spotgoodsbrandid query int false "现货品牌ID"
// @Success 200 {array} models.Ermcp3ReportOPLog
// @Failure 500 {object} app.Response
// @Router /Ermcp3/QryReportDaySpotDetail [get]
// @Tags 企业风险管理v3(app)
func QryReportDaySpotDetail(c *gin.Context) {
	a := app.GinUtils{Gin: app.Gin{C: c}}
	req := struct {
		USERID           int64  `form:"userid" binding:"required"`          // 用户id
		TRADEDATE        string `form:"tradedate" binding:"required"`       // 交易日
		DELIVERYGOODSID  int32  `form:"deliverygoodsid" binding:"required"` // 现货商品id
		SPOTGOODSBRANDID int32  `form:"spotgoodsbrandid"`                   // 品牌id
		WRSTANDARDID     int32  `form:"wrstandardid"`                       // 品类id
	}{}
	a.DoBindReq(&req)
	m := models.Ermcp3ReportOPLog{USERID: req.USERID, DELIVERYGOODSID: req.DELIVERYGOODSID,
		TRADEDATE: req.TRADEDATE, SPOTGOODSBRANDID: req.SPOTGOODSBRANDID, WRSTANDARDID: req.WRSTANDARDID,
		LogTypeFilter: "2,3,24,25,26,27"}
	a.DoGetDataI(&m)
}

// @Summary 查询财务日报表款项(菜单:报表查询/财务报表/日报表/款项)
// @Produce json
// @Security ApiKeyAuth
// @Param userid query int true "用户ID"
// @Param tradedate query string true "交易日(格式:yyyyMMdd)"
// @Success 200 {array} models.Ermcp3ReportOPLog
// @Failure 500 {object} app.Response
// @Router /Ermcp3/QryReportDayFinanceKx [get]
// @Tags 企业风险管理v3(app)
func QryReportDayFinanceKx(c *gin.Context) {
	a := app.GinUtils{Gin: app.Gin{C: c}}
	req := struct {
		USERID    int64  `form:"userid" binding:"required"`    // 用户id
		TRADEDATE string `form:"tradedate" binding:"required"` // 交易日
	}{}
	a.DoBindReq(&req)
	m := models.Ermcp3ReportOPLog{USERID: req.USERID, TRADEDATE: req.TRADEDATE, LogTypeFilter: "8,9,10"}
	a.DoGetDataI(&m)
}

// @Summary 查询财务日报表发票(菜单:报表查询/财务报表/日报表/发票)
// @Produce json
// @Security ApiKeyAuth
// @Param userid query int true "用户ID"
// @Param tradedate query string true "交易日(格式:yyyyMMdd)"
// @Success 200 {array} models.Ermcp3ReportOPLog
// @Failure 500 {object} app.Response
// @Router /Ermcp3/QryReportDayFinanceFp [get]
// @Tags 企业风险管理v3(app)
func QryReportDayFinanceFp(c *gin.Context) {
	a := app.GinUtils{Gin: app.Gin{C: c}}
	req := struct {
		USERID    int64  `form:"userid" binding:"required"`    // 用户id
		TRADEDATE string `form:"tradedate" binding:"required"` // 交易日
	}{}
	a.DoBindReq(&req)
	m := models.Ermcp3ReportOPLog{USERID: req.USERID, TRADEDATE: req.TRADEDATE, LogTypeFilter: "11, 12"}
	a.DoGetDataI(&m)
}

// @Summary 查询现货日报表(菜单:报表查询/现货报表/现货日报表)
// @Produce json
// @Security ApiKeyAuth
// @Param userid query int true "用户id"
// @Param reckondate query string true "交易日(格式:yyyyMMdd)"
// @Param accountid query int false "期货账户ID"
// @Param deliverygoodsid query int false "现货品种ID"
// @Param wrstandardid query int false "品类ID"
// @Param spotgoodsbrandid query int false "现货品牌ID"
// @Success 200 {array} models.Ermcp3ReckonAreaSpotSub
// @Failure 500 {object} app.Response
// @Router /Ermcp3/QryReportDaySpot [get]
// @Tags 企业风险管理v3(app)
func QryReportDaySpot(c *gin.Context) {
	a := app.GinUtils{Gin: app.Gin{C: c}}
	m := models.Ermcp3ReckonAreaSpotSub{}
	a.DoBindReq(&m)
	a.DoGetDataI(&m)
}

// QryReportMonthSpot
// @Summary 查询现货月报表(菜单:报表查询/现货报表/现货月报表)
// @Produce json
// @Security ApiKeyAuth
// @Param userid query int true "用户id"
// @Param cycletype query int true "周期类型 - 1:月 2:季 3:年 4:周 5:全报表【原值】"
// @Param cycletime query string true "周期时间 月(YYYYMM)  季(YYYYQ) 年(YYYY) 周(YYYYIW) 全(0)【原值】"
// @Param accountid query int false "期货账户ID"
// @Param deliverygoodsid query int false "现货品种ID"
// @Param wrstandardid query int false "品类ID"
// @Param spotgoodsbrandid query int false "现货品牌ID"
// @Success 200 {array} models.Ermcp3ReportAreaSpotSub
// @Failure 500 {object} app.Response
// @Router /Ermcp3/QryReportMonthSpot [get]
// @Tags 企业风险管理v3(app)
func QryReportMonthSpot(c *gin.Context) {
	a := app.GinUtils{Gin: app.Gin{C: c}}
	m := models.Ermcp3ReportAreaSpotSub{}
	a.DoBindReq(&m)
	a.DoGetDataI(&m)
}

// @Summary 查询现货月报表详情(菜单:报表查询/现货月报表/现货月报表详情)
// @Produce json
// @Security ApiKeyAuth
// @Param userid query int true "用户id"
// @Param cycletype query int true "周期类型 - 1:月 2:季 3:年 4:周 5:全报表【原值】"
// @Param cycletime query string true "周期时间 月(YYYYMM)  季(YYYYQ) 年(YYYY) 周(YYYYIW) 全(0)【原值】"
// @Param accountid query int false "期货账户ID"
// @Param deliverygoodsid query int false "现货品种ID"
// @Param wrstandardid query int false "品类ID"
// @Param spotgoodsbrandid query int false "现货品牌ID"
// @Success 200 {array} models.Ermcp3ReportAreaSpotSub
// @Failure 500 {object} app.Response
// @Router /Ermcp3/QryReportMonthSpotDetail [get]
// @Tags 企业风险管理v3(app)
func QryReportMonthSpotDetail(c *gin.Context) {
	a := app.GinUtils{Gin: app.Gin{C: c}}
	req := models.Ermcp3ReportAreaSpotSub{}
	a.DoBindReq(&req)
	if req.CYCLETYPE != 1 || len(req.CYCLETIME) != 6 {
		// 目前仅支持月报表明细, 月报表的日期应是6位,如 202101
		a.Response(http.StatusBadRequest, e.INVALID_PARAMS, nil)
		return
	}
	t1 := req.CYCLETIME + "01"
	t2 := req.CYCLETIME + "31"
	// 月报表明细 = 01~31 日报表
	m := models.Ermcp3ReckonAreaSpotSub{
		AREAUSERID: req.AREAUSERID, DELIVERYGOODSID: req.DELIVERYGOODSID, ACCOUNTID: req.ACCOUNTID,
		WRSTANDARDID: req.WRSTANDARDID, SPOTGOODSBRANDID: req.SPOTGOODSBRANDID, BeginDate: t1, EndDate: t2}
	a.DoGetDataI(&m)
}

// QryReportAreaSpotPL
// @Summary 查询现货损益报表(现货损益报表)
// @Produce json
// @Security ApiKeyAuth
// @Param userid query int true "用户ID"
// @Param querytype query int true "查询类型 1-日报表 2-月报表"
// @Param querydate query string true "查询日期(格式 日报表YYYYMMDD, 月报表YYYYMM)"
// @Param deliverygoodsid query int false "现货商品ID"
// @Param spotgoodsbrandid query int false "品牌ID"
// @Param wrstandardid query int false "品类ID"
// @Success 200 {array} models.Ermcp3ReportAreaSpotPL
// @Failure 500 {object} app.Response
// @Router /Ermcp3/QryReportAreaSpotPL [get]
// @Tags 企业风险管理v3(app)
func QryReportAreaSpotPL(c *gin.Context) {
	a := app.GinUtils{Gin: app.Gin{C: c}}
	req := struct {
		USERID           int64  `form:"userid" binding:"required"`    // 用户id
		QUERYTYPE        int32  `form:"querytype" binding:"required"` // 查询类型
		QUERYDATE        string `form:"querydate" binding:"required"` // 交易日
		DELIVERYGOODSID  int32  `form:"deliverygoodsid"`              // 现货商品id
		SPOTGOODSBRANDID int32  `form:"spotgoodsbrandid"`             // 现货品牌id
		WRSTANDARDID     int64  `form:"wrstandardid"`                 // 品类id
	}{}
	a.DoBindReq(&req)
	if QueryDate(req.QUERYDATE).IsNumberic(req.QUERYTYPE) {
		m := models.Ermcp3ReportAreaSpotPL{AREAUSERID: req.USERID, WRSTANDARDID: req.WRSTANDARDID,
			SPOTGOODSBRANDID: req.SPOTGOODSBRANDID, DELIVERYGOODSID: req.DELIVERYGOODSID,
			ReportDate: req.QUERYDATE, ReportType: req.QUERYTYPE}
		a.DoGetDataI(&m)
	} else {
		a.Gin.Response(http.StatusBadRequest, e.INVALID_PARAMS, nil)
	}
}

// QryReckonAreaExpourse
// @Summary 查询敞口日报表(报表/敞口报表/日报表)
// @Produce json
// @Security ApiKeyAuth
// @Param userid query int true "用户ID"
// @Param tradedate query string true "交易日(YYYYMMDD)"
// @Success 200 {array} models.Ermcp3ReckonExpourse
// @Failure 500 {object} app.Response
// @Router /Ermcp3/QryReckonAreaExpourse [get]
// @Tags 企业风险管理v3(app)
func QryReckonAreaExpourse(c *gin.Context) {
	a := app.GinUtils{Gin: app.Gin{C: c}}
	req := struct {
		USERID    int64  `form:"userid"`                       // 用户id
		TRADEDATE string `form:"tradedate" binding:"required"` // 交易日
	}{}
	a.DoBindReq(&req)
	m := models.Ermcp3ReckonExpourse{AREAUSERID: req.USERID, RECKONDATE: req.TRADEDATE}
	a.DoGetDataI(&m)
}

// QryReportAreaExpourse
// @Summary 查询敞口周期报表(报表/敞口报表/周(月、季、年)报表)
// @Produce json
// @Security ApiKeyAuth
// @Param userid query int true "用户ID"
// @Param cycletype query int true "周期类型 - 1:月 2:季 3:年 4:周 5:全报表【原值】"
// @Param cycletime query string true "周期时间 月(YYYYMM)  季(YYYYQ) 年(YYYY) 周(YYYYIW) 全(0)【原值】"
// @Success 200 {array} models.Ermcp3ReportExpourse
// @Failure 500 {object} app.Response
// @Router /Ermcp3/QryReportAreaExpourse [get]
// @Tags 企业风险管理v3(app)
func QryReportAreaExpourse(c *gin.Context) {
	a := app.GinUtils{Gin: app.Gin{C: c}}
	req := struct {
		USERID    int64  `form:"userid" binding:"required"`    // 用户id
		CYCLETIME string `form:"cycletime" binding:"required"` // 周期时间 月(YYYYMM)  季(YYYYQ) 年(YYYY) 周(YYYYIW) 全(0)【原值】
		CYCLETYPE int32  `form:"cycletype" binding:"required"` // 周期类型 - 1:月 2:季 3:年 4:周 5:全报表【原值】
	}{}
	a.DoBindReq(&req)
	p := CycleTypeCheck{CYCLETYPE: req.CYCLETYPE, CYCLETIME: req.CYCLETIME}
	a.CheckParam(&p)
	m := models.Ermcp3ReportExpourse{AREAUSERID: req.USERID,
		CYCLETYPE: req.CYCLETYPE, CYCLETIME: req.CYCLETIME}
	a.DoGetDataI(&m)
}
