package models

import (
	"github.com/beego/beego/v2/client/orm"
	"github.com/rdlucklib/rdluck_tools/paging"
	"time"
)

type CygxArticleDepartment struct {
	DepartmentId int       `orm:"column(department_id);pk;主键ID"`
	CreateTime   time.Time `description:"创建时间"`
	NickName     string    `description:"昵称"`
	Remark       string    `description:"备注"`
	Remarks      string    `description:"备注辅助字段"`
	Content      string    `description:"初始内容"`
}

type CygxArticleDepartmentRep struct {
	DepartmentId int    `description:"作者ID"`
	CreateTime   string `description:"创建时间"`
	NickName     string `description:"昵称"`
	ImgUrl       string `description:"头像链接"`
	FollowNum    int    `description:"是否关注 1是 ,0 否"`
	IsMyFollow   bool   `description:"是否关注"`
	List         []*IndustrialManagementIdName
}

type CygxArticleDepartmentRepPc struct {
	DepartmentId int    `description:"作者ID"`
	CreateTime   string `description:"创建时间"`
	NickName     string `description:"昵称"`
	ImgUrl       string `description:"头像链接"`
	FollowNum    int    `description:"是否关注 1是 ,0 否"`
	IsMyFollow   bool   `description:"是否关注"`
	List         []*IndustrialManagementIdNamePc
}

type CygxArticleDepartmentId struct {
	DepartmentId int `description:"作者ID"`
}

type CygxArticleDepartmentList struct {
	HaveResearch bool               `description:"是否有研选权限"`
	Paging       *paging.PagingItem `description:"分页数据"`
	ListnNew     []*IndustrialManagementIdInt
	List         []*CygxArticleDepartmentRep
}

type CygxArticleDepartmentListPc struct {
	HaveResearch bool               `description:"是否有研选权限"`
	Paging       *paging.PagingItem `description:"分页数据"`
	ListnNew     []*IndustrialManagementIdInt
	List         []*CygxArticleDepartmentRepPc
}

//详情
func GetArticleDepartmentDateil(nickName, remarks string) (item *CygxArticleDepartmentRep, err error) {
	o := orm.NewOrm()
	sql := `SELECT * FROM cygx_article_department WHERE nick_name = ? AND  remarks = ? LIMIT 1 `
	err = o.Raw(sql, nickName, remarks).QueryRow(&item)
	return
}

func GetArticleDepartmentDateilById(departmentId int) (item *CygxArticleDepartmentRep, err error) {
	o := orm.NewOrm()
	sql := `SELECT * FROM cygx_article_department WHERE department_id = ? `
	err = o.Raw(sql, departmentId).QueryRow(&item)
	return
}

//数量
func GetArticleDepartmentCount(condition string) (count int, err error) {
	o := orm.NewOrm()
	sql := ` SELECT COUNT(*) count
		FROM
		( SELECT COUNT(1)  FROM cygx_article_department AS d
		INNER JOIN cygx_article AS a ON a.department_id = d.department_id
		INNER JOIN cygx_industrial_article_group_management AS mg ON mg.article_id = a.article_id
		INNER JOIN cygx_industrial_management AS m ON m.industrial_management_id = mg.industrial_management_id WHERE 1= 1  `
	if condition != "" {
		sql += condition
	}
	sql += ` GROUP BY d.department_id ) AS num `

	err = o.Raw(sql).QueryRow(&count)
	return
}

//列表
func GetCygxArticleDepartmentList(startSize, pageSize int, condition string, uid int) (items []*CygxArticleDepartmentRep, err error) {
	o := orm.NewOrm()
	sql := `SELECT d.*,
		( SELECT COUNT( 1 ) FROM cygx_article AS a INNER JOIN cygx_article_history_record as h ON h.article_id = a.article_id WHERE  a.department_id = d.department_id  AND a.publish_status = 1 ) AS art_num,
		( SELECT COUNT( 1 ) FROM cygx_article_department_follow AS f  WHERE f.department_id = d.department_id AND f.user_id = ? AND f.type = 1 ) AS follow_num
		FROM
		cygx_article_department AS d
		INNER JOIN cygx_article AS a ON a.department_id = d.department_id
		INNER JOIN cygx_industrial_article_group_management AS mg ON mg.article_id = a.article_id
		INNER JOIN cygx_industrial_management AS m ON m.industrial_management_id = mg.industrial_management_id  WHERE 1= 1 `
	if condition != "" {
		sql += condition
	}
	sql += ` GROUP BY
		d.department_id
		ORDER BY  art_num DESC  LIMIT ?,?`
	_, err = o.Raw(sql, uid, startSize, pageSize).QueryRows(&items)
	return
}

//列表
func GetCygxArticleDepartmentListPc(startSize, pageSize int, condition string, uid int) (items []*CygxArticleDepartmentRepPc, err error) {
	o := orm.NewOrm()
	sql := `SELECT d.*,
		( SELECT COUNT( 1 ) FROM cygx_article AS a INNER JOIN cygx_article_history_record as h ON h.article_id = a.article_id WHERE  a.department_id = d.department_id  AND a.publish_status = 1 ) AS art_num,
		( SELECT COUNT( 1 ) FROM cygx_article_department_follow AS f  WHERE f.department_id = d.department_id AND f.user_id = ? AND f.type = 1 ) AS follow_num
		FROM
		cygx_article_department AS d
		INNER JOIN cygx_article AS a ON a.department_id = d.department_id
		INNER JOIN cygx_industrial_article_group_management AS mg ON mg.article_id = a.article_id
		INNER JOIN cygx_industrial_management AS m ON m.industrial_management_id = mg.industrial_management_id  WHERE 1= 1 `
	if condition != "" {
		sql += condition
	}
	sql += ` GROUP BY
		d.department_id
		ORDER BY  art_num DESC  LIMIT ?,?`
	_, err = o.Raw(sql, uid, startSize, pageSize).QueryRows(&items)
	return
}

//产业列表
func GetIndustrialSubjectByDepartment(departmentId int) (items []*IndustrialManagementIdInt, err error) {
	o := orm.NewOrm()
	sql := `SELECT
			m.*,
			( SELECT GROUP_CONCAT(DISTINCT s.subject_name ORDER BY s.create_time DESC SEPARATOR '/' ) FROM cygx_industrial_subject AS s WHERE s.industrial_management_id = m.industrial_management_id) AS subject_name,
			( SELECT publish_date FROM cygx_article AS a INNER JOIN cygx_industrial_article_group_management as mg ON mg.article_id = a.article_id  ORDER BY publish_date DESC LIMIT 1  ) AS art_time
		FROM
			cygx_article_department AS d
			INNER JOIN cygx_article AS a ON a.department_id = d.department_id
			INNER JOIN cygx_industrial_article_group_management AS mg ON mg.article_id = a.article_id
			INNER JOIN cygx_industrial_management AS m ON m.industrial_management_id = mg.industrial_management_id 
			WHERE 1= 1
			AND d.department_id = ?
			AND a.publish_status = 1
			GROUP BY a.article_id
			ORDER BY art_time DESC
			LIMIT 4 `
	_, err = o.Raw(sql, departmentId).QueryRows(&items)
	return
}

//最新产业列表
func GetIndustrialSubjectByDepartmentNew() (items []*IndustrialManagementIdInts, err error) {
	o := orm.NewOrm()
	sql := `SELECT
	a.article_id,
	a.industrial_and_subject_ids,
	m.*,
	MAX( a.publish_date ) art_time
FROM
	cygx_article_department AS d
	INNER  JOIN cygx_article AS a ON a.department_id = d.department_id
	LEFT JOIN cygx_industrial_article_group_management AS mg ON mg.article_id = a.article_id
	LEFT JOIN cygx_industrial_management AS m ON m.industrial_management_id = mg.industrial_management_id 
	LEFT JOIN cygx_industrial_article_group_subject AS sg  ON sg.article_id = a.article_id
WHERE
	1 = 1 
	AND a.publish_status = 1 
	AND a.industrial_and_subject_ids != '' 
GROUP BY
	a.industrial_and_subject_ids 
ORDER BY
	art_time DESC 
	LIMIT 6 `
	_, err = o.Raw(sql).QueryRows(&items)
	return
}

//获取作者数量
func GetDepartmentCount(departmentId int) (count int, err error) {
	sqlCount := ` SELECT COUNT(1) AS count  FROM cygx_article_department WHERE department_id=? `
	o := orm.NewOrm()
	err = o.Raw(sqlCount, departmentId).QueryRow(&count)
	return
}

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

//最新标的列表
func GetIndustrialSubjectNewList(condition string) (items []*IndustrialSubjectList, err error) {
	o := orm.NewOrm()
	sql := `SELECT s.*
			FROM
				cygx_industrial_subject AS s
				INNER JOIN cygx_industrial_article_group_subject AS sg ON sg.industrial_subject_id = s.industrial_subject_id
				INNER JOIN cygx_article AS art ON art.article_id = sg.article_id
				INNER JOIN cygx_industrial_article_group_management AS mg ON mg.article_id = art.article_id
			WHERE
				1 = 1 
				AND art.publish_status = 1 `
	if condition != "" {
		sql += condition
	}
	sql += ` GROUP BY s.industrial_subject_id ORDER BY s.create_time DESC LIMIT 4`
	_, err = o.Raw(sql).QueryRows(&items)
	return
}

//最新标的列表
func GetIndustrialSubjectNewListByDepartmentId(departmentId, industrialManagementId int) (items []*IndustrialManagementIdName, err error) {
	o := orm.NewOrm()
	sql := `SELECT art.article_id,
			( SELECT GROUP_CONCAT( DISTINCT s.subject_name ORDER BY s.industrial_subject_id DESC SEPARATOR '/' )  ) AS subject_name
			FROM
				cygx_article AS art
				INNER JOIN cygx_industrial_article_group_subject AS sg ON sg.article_id = art.article_id
				INNER JOIN cygx_industrial_subject AS s ON s.industrial_subject_id = sg.industrial_subject_id 
			WHERE
				department_id = ?
				AND s.industrial_management_id = ?
				GROUP BY art.article_id
				ORDER BY s.create_time DESC  LIMIT 4`
	_, err = o.Raw(sql, departmentId, industrialManagementId).QueryRows(&items)
	return
}

//最新标的列表
func GetArticleByDepartmentId(departmentId int) (items []*IndustrialManagementIdName, err error) {
	o := orm.NewOrm()
	sql := `SELECT article_id,is_report,MAX( publish_date ) art_time  FROM cygx_article WHERE department_id = ? AND  publish_status = 1 AND subject_ids != '' GROUP  BY subject_ids  ORDER BY art_time DESC  LIMIT 4 `
	_, err = o.Raw(sql, departmentId).QueryRows(&items)
	return
}

func GetSubjectNames(articleId int) (subjects string, err error) {
	sql := ` SELECT GROUP_CONCAT( DISTINCT s.subject_name ORDER BY id ASC SEPARATOR '/' ) AS subject_name 
				FROM
				cygx_industrial_article_group_subject as sg 
				INNER JOIN cygx_industrial_subject as  s ON s.industrial_subject_id = sg.industrial_subject_id 
				WHERE article_id = ?`
	o := orm.NewOrm()
	err = o.Raw(sql, articleId).QueryRow(&subjects)
	return
}

func GetIndustrialNames(articleId int) (Industrial string, err error) {
	sql := ` SELECT
	m.industry_name
FROM
	cygx_industrial_article_group_management as mg 
	INNER JOIN cygx_industrial_management as  m ON m.industrial_management_id = mg.industrial_management_id 
WHERE
	mg.article_id = ?
	ORDER BY  m.industrial_management_id DESC
	LIMIT 1
`
	o := orm.NewOrm()
	err = o.Raw(sql, articleId).QueryRow(&Industrial)
	return
}

type IndustrialManagementIdNamePc struct {
	Title        string `description:"标题"`
	PublishDate  string `description:"发布时间"`
	DepartmentId int    `description:"作者ID"`
	ArticleId    int    `description:"文章id"`
	IndustryName string `description:"产业名称"`
	SubjectName  string `description:"标的名称"`
	IsReport     string `description:"1观点,0纪要"`
	Pv           int    `description:"Pv"`
}

//最新标的列表
func GetArticleByDepartmentIdPc(departmentId int, articleIdGroup string) (items []*IndustrialManagementIdNamePc, err error) {
	o := orm.NewOrm()
	sql := `SELECT
			m.industry_name,
			(SELECT count(1) FROM cygx_article_history_record_newpv as h WHERE h.article_id = art.article_id ) as pv,
			GROUP_CONCAT( DISTINCT s.subject_name SEPARATOR '/' ) AS subject_name,
			art.* 
		FROM
			cygx_article AS art
			LEFT JOIN cygx_industrial_article_group_management AS mg ON mg.article_id = art.article_id
			LEFT JOIN cygx_industrial_management AS m ON m.industrial_management_id = mg.industrial_management_id
			LEFT JOIN cygx_industrial_article_group_subject AS sg ON sg.article_id = art.article_id
			LEFT JOIN cygx_industrial_subject AS s ON s.industrial_subject_id = sg.industrial_subject_id 
		WHERE
			department_id = ? 
			AND publish_status = 1`
	if articleIdGroup != "" {
		sql += ` AND art.article_id IN (` + articleIdGroup + `) `
	}
	sql += ` GROUP BY art.article_id ORDER BY publish_date DESC `
	_, err = o.Raw(sql, departmentId).QueryRows(&items)
	return
}