package data_source

import (
	"eta/eta_api/models/data_manage"
	"eta/eta_api/utils"
	"github.com/beego/beego/v2/client/orm"
	"time"
)

type Longzhonginfo struct {
	LongzhonginfoId int
	TradeCode       string
	SecName         string
	Unit            string
	Frequency       string
	LastModifyDate  string
}

func GetLongzhonginfoByClassifyId(classifyId int) (items []*Longzhonginfo, err error) {
	sql := `SELECT * FROM longzhonginfo WHERE classify_id=? ORDER BY longzhonginfo_id ASC `
	o := orm.NewOrmUsingDB("edb")
	_, err = o.Raw(sql, classifyId).QueryRows(&items)
	return
}

func GetLongzhongDataMaxCount(classifyId int) (count int, err error) {
	o := orm.NewOrmUsingDB("edb")
	sql := `SELECT MAX(t.num) AS count FROM (
				SELECT COUNT(1) AS num  FROM longzhonginfo AS a
				INNER JOIN longzhongdata AS b ON a.longzhonginfo_id=b.longzhonginfo_id
				WHERE a.classify_id=?
				GROUP BY a.longzhonginfo_id
			)AS t `
	err = o.Raw(sql, classifyId).QueryRow(&count)
	return
}

type Longzhongdata struct {
	LongzhongdataId int `orm:"column(longzhongdata_id);pk"`
	LongzhonginfoId int
	TradeCode       string
	Dt              string
	Close           float64
	CreateTime      time.Time
	ModifyTime      time.Time
	UnitDesc        string
	UpdTime         string
	DisplayTime     string
}

func GetLongzhongDataById(lzInfoId int) (items []*Longzhongdata, err error) {
	o := orm.NewOrmUsingDB("edb")
	sql := `SELECT * FROM longzhongdata WHERE longzhonginfo_id=? ORDER BY dt DESC `
	_, err = o.Raw(sql, lzInfoId).QueryRows(&items)
	return
}

func GetLongzhongSurveyDataMaxCount(classifyName string) (count int, err error) {
	o := orm.NewOrmUsingDB("edb")
	sql := `SELECT MAX(t.num) AS count FROM (
				SELECT COUNT(1) AS num  FROM longzhong_survey_product AS a
				INNER JOIN longzhong_survey_data AS b ON a.survey_product_id=b.survey_product_id
				WHERE a.breed_name=?
				GROUP BY a.survey_product_id
			)AS t `
	err = o.Raw(sql, classifyName).QueryRow(&count)
	return
}

func GetLongzhongSurveyDataMaxCountByFrequency(classifyName string, frequency int) (count int, err error) {
	o := orm.NewOrmUsingDB("edb")
	sql := `SELECT MAX(t.num) AS count FROM (
				SELECT COUNT(1) AS num  FROM longzhong_survey_product AS a
				INNER JOIN longzhong_survey_data AS b ON a.survey_product_id=b.survey_product_id
				WHERE a.breed_name=? AND a.frequency=?
				GROUP BY a.survey_product_id
			)AS t `
	err = o.Raw(sql, classifyName, frequency).QueryRow(&count)
	return
}

type ExportLzSurveyDataMaxCount struct {
	Count   int `description:"最大数据量"`
	BreedId int `description:"品种ID"`
}

func GetExportLzSurveyDataMaxCount(breedIds []string) (items []ExportLzSurveyDataMaxCount, err error) {
	if len(breedIds) == 0 {
		return
	}
	o := orm.NewOrmUsingDB("edb")
	sql := ` SELECT
				MAX(t.num) AS count,
				t.breed_id
			FROM
				(
					SELECT
						COUNT(1) AS num,
						a.breed_id AS breed_id
					FROM
						longzhong_survey_product AS a
					INNER JOIN longzhong_survey_data AS b ON a.survey_product_id = b.survey_product_id
					WHERE
						a.breed_id IN (` + utils.GetOrmInReplace(len(breedIds)) + `)
					GROUP BY
						a.survey_product_id
				) AS t
			GROUP BY
				t.breed_id `
	_, err = o.Raw(sql, breedIds).QueryRows(&items)
	return
}

func GetExportLzSurveyDataByBreedIds(breedIds []string) (items []*LongzhongSurveyData, err error) {
	if len(breedIds) == 0 {
		return
	}
	o := orm.NewOrmUsingDB("edb")
	fields := ` survey_product_id, breed_id, input_value, data_time `
	sql := `SELECT ` + fields + ` FROM longzhong_survey_data WHERE breed_id IN (` + utils.GetOrmInReplace(len(breedIds)) + `) ORDER BY breed_id ASC, survey_product_id ASC, data_time DESC `
	_, err = o.Raw(sql, breedIds).QueryRows(&items)
	return
}

type LongzhongSurveyData struct {
	SurveyDataId         int `orm:"column(survey_data_id);pk"`
	SurveyProductId      int
	ProjectQuotaId       int64
	BreedId              string
	BreedName            string
	QuotaId              string
	QuotaName            string
	UnitId               string
	UnitName             string
	SampleType           int64
	SampleId             string
	SampleName           string
	DeviceId             string
	Device               string
	ProductCraftId       string
	ProductCraft         string
	ProductLine          string
	InputMode            int64
	Frequency            int64
	InputValue           float64
	TaskShouldFinishTime int64
	CustomId             string
	CustomType           int64
	Custom               string
	QuotaSampleId        int64
	TaskActualFinishTime int64
	AreaName             string
	ProvinceName         string
	ResearchStartData    int64
	ResearchStopData     int64
	DataTime             string
}

func GetLongzhongSurveyDataById(lzInfoId int) (items []*LongzhongSurveyData, err error) {
	o := orm.NewOrmUsingDB("edb")
	sql := `SELECT * FROM longzhong_survey_data WHERE survey_product_id=? ORDER BY data_time DESC `
	_, err = o.Raw(sql, lzInfoId).QueryRows(&items)
	return
}

// GetLzItemList 模糊查询隆众数据库指标列表
func GetLzItemList(keyword string) (items []*data_manage.LongzhongSurveyProduct, err error) {
	o := orm.NewOrmUsingDB("edb")

	sql := "SELECT * FROM longzhong_survey_product WHERE CONCAT(sample_name,breed_name,custom,quota_name,lz_code) LIKE ? "
	_, err = o.Raw(sql, utils.GetLikeKeyword(keyword)).QueryRows(&items)
	return

}

type lzSurveyData struct {
	DataTime   string `orm:"column(data_time)" description:"日期"`
	InputValue string `orm:"column(input_value)" description:"值"`
}

// GetLzItemListByCode 根据code查询隆众数据列表
func GetLzItemListByCode(lzCode string) (items []*lzSurveyData, err error) {
	o := orm.NewOrmUsingDB("edb")

	sql := "SELECT * FROM longzhong_survey_data WHERE survey_product_id=? GROUP BY data_time DESC"
	_, err = o.Raw(sql, lzCode).QueryRows(&items)
	return
}

// GetLzProductIdByCode 根据code查询隆众数据列表
func GetLzProductIdByCode(lzCode string) (productId int, err error) {
	o := orm.NewOrmUsingDB("edb")

	sql := "SELECT survey_product_id FROM longzhong_survey_product WHERE lz_code=?"
	err = o.Raw(sql, lzCode).QueryRow(&productId)
	return
}

// GetLzProductIdByCode 根据code查询隆众数据列表
func GetLzSurveyDataMaxCountByProductId(surveyProductId int) (productId int, err error) {
	o := orm.NewOrmUsingDB("edb")

	sql := "SELECT COUNT(1) FROM longzhong_survey_data WHERE survey_product_id=?"
	err = o.Raw(sql, surveyProductId).QueryRow(&productId)
	return
}