package cygx

import (
	"github.com/beego/beego/v2/client/orm"
	"strconv"
	"strings"
	"time"
)

type IndustrialSubjectAdd struct {
	SubjectName            string `description:"标的名称"`
	IndustrialManagementId int    `description:"产业id"`
	Source                 int    `description:"来源,1正常添加,2:通过文章添加,3通过活动添加(默认为1)"`
}

type IndustrialSubjectDelete struct {
	IndustrialSubjectId int `orm:"column(industrial_subject_id);pk" description:"标的id"`
}

type CygxIndustrialSubject struct {
	IndustrialSubjectId    int       `orm:"column(industrial_subject_id);pk" description:"标的id"`
	IndustrialManagementId int       `description:"产业id"`
	SubjectName            string    `description:"标的名称"`
	CreateTime             time.Time `description:"创建时间"`
	Source                 int       `description:"来源,1正常添加,2:通过文章添加,3通过活动添加(默认为1)"`
}

type CygxIndustrialSubjectNum struct {
	IndustrialSubjectId    int       `orm:"column(industrial_subject_id);pk" description:"标的id"`
	IndustrialManagementId int       `description:"产业id"`
	SubjectName            string    `description:"标的名称"`
	CreateTime             time.Time `description:"创建时间"`
	ArtNum                 int       `description:"文章数量"`
	IsRelevance            bool      `description:"是否存在关联文章"`
}

type GetIndustrialSubjectList struct {
	List []*CygxIndustrialSubject
}

type GetIndustrialSubjectNumList struct {
	List []*CygxIndustrialSubjectNum
}

func GetcygxIndustrialSubject(industrialManagementId int) (items []*CygxIndustrialSubject, err error) {
	o := orm.NewOrmUsingDB("hz_cygx")
	sql := `SELECT subject_name FROM cygx_industrial_subject  WHERE industrial_management_id = ?`
	_, err = o.Raw(sql, industrialManagementId).QueryRows(&items)
	return
}

func UpdateIndustrialManagementSubjectNames(industrialManagementId int, industryName string) (err error) {
	o := orm.NewOrmUsingDB("hz_cygx")
	var nameSub string
	listSub, err := GetcygxIndustrialSubject(industrialManagementId)
	if err != nil {
		return
	}
	for _, v := range listSub {
		nameSub += v.SubjectName + ","
	}
	nameSub += industryName
	sql := `UPDATE cygx_industrial_management SET subject_names = ? WHERE industrial_management_id = ?`
	_, err = o.Raw(sql, nameSub, industrialManagementId).Exec()
	return
}

// 新增
func AddIndustrialSubject(item *CygxIndustrialSubject) (newId int64, err error) {
	o := orm.NewOrmUsingDB("hz_cygx")
	newId, err = o.Insert(item)
	if err != nil {
		return
	}
	return
}

// 批量新增
func AddIndustrialSubjectList(items []*CygxIndustrialSubject) (newIdStr string, err error) {
	o := orm.NewOrmUsingDB("hz_cygx")
	to, err := o.Begin()
	if err != nil {
		return
	}
	defer func() {
		if err != nil {
			_ = to.Rollback()
		} else {
			_ = to.Commit()
		}
	}()
	for _, v := range items {
		newId, errSub := to.Insert(v)
		newIdStr += strconv.Itoa(int(newId)) + ","
		if errSub != nil {
			return
		}
	}
	newIdStr = strings.Trim(newIdStr, ",")
	return
}

// 列表
func GetIndustrialSubjectAll(IndustrialManagementId int) (items []*CygxIndustrialSubjectNum, err error) {
	o := orm.NewOrmUsingDB("hz_cygx")
	sql := `SELECT *,
		( SELECT COUNT( 1 ) FROM cygx_industrial_article_group_subject AS sub_g WHERE sub_g.industrial_subject_id = sub.industrial_subject_id ) AS art_num
		FROM
		cygx_industrial_subject AS sub 
		WHERE
		sub.industrial_management_id = ? `
	_, err = o.Raw(sql, IndustrialManagementId).QueryRows(&items)
	return
}

// 获取数量
func GetIndustrialSubjectCount(condition string, pars []interface{}) (count int, err error) {
	sqlCount := ` SELECT COUNT(1) AS count  FROM cygx_industrial_subject WHERE 1=1 `
	if condition != "" {
		sqlCount += condition
	}
	o := orm.NewOrmUsingDB("hz_cygx")
	err = o.Raw(sqlCount, pars).QueryRow(&count)
	return
}

// 修改
func EditIndustrialSubject(item *CygxIndustrialSubject) (err error) {
	o := orm.NewOrmUsingDB("hz_cygx")
	sql := `UPDATE cygx_industrial_subject SET  subject_name=? WHERE industrial_subject_id=? `
	_, err = o.Raw(sql, item.SubjectName, item.IndustrialSubjectId).Exec()
	return
}

// 删除数据
func DeleteIndustrialSubject(industrialSubjectId int) (err error) {
	o := orm.NewOrmUsingDB("hz_cygx")
	sql := ` DELETE FROM cygx_industrial_subject WHERE industrial_Subject_id = ?`
	_, err = o.Raw(sql, industrialSubjectId).Exec()
	return
}

type ArtGroupIndustrialSubjectRep struct {
	SubjectName string `description:"标的名称"`
}

type ArtGroupIndustrialSubjectRepList struct {
	List []*ArtGroupIndustrialSubjectRep
}

// 获取文章关联的标的数量
func GetArtGroupIndustrialSubject(reportId int) (item []*ArtGroupIndustrialSubjectRep, err error) {
	sql := ` SELECT sub.subject_name FROM cygx_industrial_article_group_subject AS sub_g
		INNER JOIN cygx_industrial_subject AS sub ON sub.industrial_subject_id = sub_g.industrial_subject_id
		WHERE
		sub_g.cygx_article_id = ?`
	o := orm.NewOrmUsingDB("hz_cygx")
	_, err = o.Raw(sql, reportId).QueryRows(&item)
	return
}

// 获取标的关联的文章数量
func GetIndustrialSubjectGroupArtCount(industrialSubjectId int) (count int, err error) {
	sqlCount := ` SELECT COUNT(1) AS count  FROM cygx_industrial_article_group_subject WHERE industrial_subject_id=? `
	o := orm.NewOrmUsingDB("hz_cygx")
	err = o.Raw(sqlCount, industrialSubjectId).QueryRow(&count)
	return
}

// 列表
func GetIndustrialSubjectAllByIds(condition string) (items []*CygxIndustrialSubjectNum, err error) {
	o := orm.NewOrmUsingDB("hz_cygx")
	sql := `SELECT *,
		( SELECT COUNT( 1 ) FROM cygx_industrial_article_group_subject AS sub_g WHERE sub_g.industrial_subject_id = sub.industrial_subject_id ) AS art_num
		FROM
		cygx_industrial_subject AS sub 
		WHERE 1=1 ` + condition
	_, err = o.Raw(sql).QueryRows(&items)
	return
}

func GetIndustrialSubjectDetailById(IndustrialSubjectId int) (item *CygxIndustrialSubject, err error) {
	o := orm.NewOrmUsingDB("hz_cygx")
	sql := `SELECT * FROM cygx_industrial_subject WHERE industrial_subject_id = ? `
	err = o.Raw(sql, IndustrialSubjectId).QueryRow(&item)
	return
}

func GetIndustrialSubjectDetailByName(IndustrialSubjectName string) (item *CygxIndustrialSubject, err error) {
	o := orm.NewOrmUsingDB("hz_cygx")
	sql := `SELECT * FROM cygx_industrial_subject WHERE subject_name = ? `
	err = o.Raw(sql, IndustrialSubjectName).QueryRow(&item)
	return
}

// 列表
func GetIndustrialSubjectListName(condition string) (items []*ArtGroupIndustrialSubjectRep, err error) {
	o := orm.NewOrmUsingDB("hz_cygx")
	sql := `SELECT s.*
			FROM
			cygx_industrial_subject AS s
			INNER JOIN cygx_industrial_management AS m ON m.industrial_management_id =s.industrial_management_id
			WHERE m.chart_permission_id = 31 `
	if condition != "" {
		sql += condition
	}
	_, err = o.Raw(sql).QueryRows(&items)
	return
}

type CygxIndustrialSubjectListRep struct {
	IndustrialSubjectId    int    `description:"标的id"`
	IndustrialManagementId int    `description:"产业id"`
	SubjectName            string `description:"标的名称"`
	IndustryName           string `description:"分析师名称"`
}

type CygxIndustrialSubjectList struct {
	List []*CygxIndustrialSubjectListRep
}

type IndustrialNameListRep struct {
	List []*SubjectNameListRep
}

type SubjectNameListRep struct {
	Name string `description:"产业名称"`
	List []*SubjectNameRep
}

type SubjectNameRep struct {
	Name string `description:"标的名称"`
}

// 列表
func GetIndustrialSubjectListNameByChartId(condition string) (items []*CygxIndustrialSubjectListRep, err error) {
	o := orm.NewOrmUsingDB("hz_cygx")
	sql := `SELECT 	s.*,m.industry_name
			FROM
			cygx_industrial_subject AS s
			INNER JOIN cygx_industrial_management AS m ON m.industrial_management_id =s.industrial_management_id
			WHERE 1= 1 `
	if condition != "" {
		sql += condition
	}
	sql += ` GROUP BY s.subject_name`
	_, err = o.Raw(sql).QueryRows(&items)
	return
}

// 通过多个标的ID获取产业名称
func GetindustrialSubjectNames(subjectIds string) (names string, err error) {
	sql := ` SELECT
			GROUP_CONCAT( DISTINCT s.subject_name SEPARATOR '/' ) AS names 
			FROM
			cygx_industrial_subject AS s
			WHERE
			industrial_subject_id IN ( ` + subjectIds + `) `
	o := orm.NewOrmUsingDB("hz_cygx")
	err = o.Raw(sql).QueryRow(&names)
	return
}

// 列表
func GetIndustrialSubjectListNameByName(condition string) (items []*CygxIndustrialSubject, err error) {
	o := orm.NewOrmUsingDB("hz_cygx")
	sql := `SELECT * FROM cygx_industrial_subject WHERE 1= 1`
	if condition != "" {
		sql += condition
	}
	_, err = o.Raw(sql).QueryRows(&items)
	return
}

// 通过标的名称获取标的关联的ID
func GetIndustrialSubjectIdsByName(subjectName string) (industrialSubjectIds string, err error) {
	sql := ` SELECT
			GROUP_CONCAT( DISTINCT s.industrial_subject_id SEPARATOR ',' ) AS industrial_subject_ids 
			FROM
			cygx_industrial_subject AS s
			WHERE
			subject_name =? `
	o := orm.NewOrmUsingDB("hz_cygx")
	err = o.Raw(sql, subjectName).QueryRow(&industrialSubjectIds)
	return
}

// 通过标的名称获取标的关联的ID
func GetIndustrialSubjectIdsByNameLike(subjectName string) (industrialSubjectIds string, err error) {
	sql := ` SELECT
			GROUP_CONCAT( DISTINCT s.industrial_subject_id SEPARATOR ',' ) AS industrial_subject_ids 
			FROM
			cygx_industrial_subject AS s
			WHERE
			subject_name  LIKE '%` + subjectName + `%'`
	o := orm.NewOrmUsingDB("hz_cygx")
	err = o.Raw(sql).QueryRow(&industrialSubjectIds)
	return
}

type IndustrySubjectCountDetail struct {
	ArtTotalNum int `description:"文章总数量"`
	List        []*IndustrySubjectArtTypeCountList
}

type IndustrySubjectArtTypeCountList struct {
	MatchTypeName string `description:"匹配类型"`
	ArtNum        int    `description:"文章数量"`
}

// GetIndustrySubjectArtTypeCountList 获取标的关联的报告数量列表-根据类型
func GetIndustrySubjectArtTypeCountList(subjectId int) (list []*IndustrySubjectArtTypeCountList, err error) {
	o := orm.NewOrmUsingDB("hz_cygx")
	sql := `SELECT
				re.match_type_name,
				COUNT(*) AS art_num
			FROM
				cygx_industrial_subject AS sub
			INNER JOIN cygx_industrial_article_group_subject AS gsub ON gsub.industrial_subject_id = sub.industrial_subject_id
			INNER JOIN cygx_article AS art ON art.article_id = gsub.article_id
			INNER JOIN cygx_report_mapping AS re ON re.category_id = art.category_id
			WHERE
				sub.industrial_subject_id = ? AND re.match_type_name <> '' AND re.report_type = 2 AND art.publish_status = 1
			GROUP BY
				re.match_type_name `
	sql += `UNION ALL
			SELECT
				"研选报告",
				COUNT(*)
			FROM
				cygx_industrial_subject AS sub
			INNER JOIN cygx_industrial_article_group_subject AS gsub ON gsub.industrial_subject_id = sub.industrial_subject_id
			INNER JOIN cygx_article AS art ON art.article_id = gsub.article_id
			WHERE
				art.article_id > 1000000 AND art.article_type_id != 0 AND sub.industrial_subject_id = ? AND art.publish_status = 1`
	_, err = o.Raw(sql, subjectId, subjectId).QueryRows(&list)
	return
}

// 列表
func GetIndustrySubjectListByIds(IndustrialSubjectIds string) (items []*CygxIndustrialSubject, err error) {
	o := orm.NewOrmUsingDB("hz_cygx")
	sql := `SELECT * FROM cygx_industrial_subject WHERE industrial_subject_id IN (` + IndustrialSubjectIds + `) `
	_, err = o.Raw(sql).QueryRows(&items)
	return
}

// 获取标的列表
func GetCygxIndustrialSubjectListCondition(condition string, pars []interface{}) (items []*CygxIndustrialSubject, err error) {
	o := orm.NewOrmUsingDB("hz_cygx")
	sql := `SELECT * 
		FROM
			cygx_industrial_subject WHERE 1 = 1 ` + condition
	_, err = o.Raw(sql, pars).QueryRows(&items)
	return
}