package models

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

// ReportChapter 报告章节
type ReportChapter struct {
	ReportChapterId   int       `orm:"column(report_chapter_id);pk" description:"报告章节ID"`
	ReportId          int       `description:"报告ID"`
	ReportType        string    `description:"报告类型 day-晨报 week-周报"`
	ClassifyIdFirst   int       `description:"一级分类id"`
	ClassifyNameFirst string    `description:"一级分类名称"`
	TypeId            int       `description:"品种ID"`
	TypeName          string    `description:"品种名称"`
	Title             string    `description:"标题"`
	Abstract          string    `description:"摘要"`
	AddType           int       `description:"新增方式:1:新增报告,2:继承报告"`
	Author            string    `description:"作者"`
	Content           string    `description:"内容"`
	ContentSub        string    `description:"内容前两个章节"`
	Stage             int       `description:"期数"`
	Trend             string    `description:"趋势观点"`
	Sort              int       `description:"排序: 数值越小越靠前"`
	IsEdit            int       `description:"是否已编辑 0-待编辑 1-已编辑"`
	PublishState      int       `description:"发布状态 1-待发布,2-已发布"`
	PublishTime       time.Time `description:"发布时间"`
	VideoUrl          string    `description:"音频文件URL"`
	VideoName         string    `description:"音频文件名称"`
	VideoPlaySeconds  string    `description:"音频播放时长"`
	VideoSize         string    `description:"音频文件大小,单位M"`
	VideoKind         int       `description:"音频生成方式:1,手动上传,2:自动生成"`
	CreateTime        string    `description:"创建时间"`
	ModifyTime        time.Time `description:"修改时间"`
}

type ReportChapterResp struct {
	ReportChapterId  int    `description:"报告章节ID"`
	ReportId         int    `description:"报告ID"`
	ReportType       string `description:"报告类型 day-晨报 week-周报"`
	TypeId           int    `description:"品种ID"`
	TypeName         string `description:"品种名称"`
	TypeEditImg      string `description:"后台编辑时的图片"`
	Title            string `description:"标题"`
	Abstract         string `description:"摘要"`
	Author           string `description:"作者"`
	Content          string `description:"内容"`
	ContentSub       string `description:"内容前两个章节"`
	Stage            int    `description:"期数"`
	Trend            string `description:"趋势观点"`
	Sort             int    `description:"排序: 数值越小越靠前"`
	IsEdit           int    `description:"是否已编辑 0-待编辑 1-已编辑"`
	PublishState     int    `description:"发布状态 1-待发布,2-已发布"`
	VideoUrl         string `description:"音频文件URL"`
	VideoName        string `description:"音频文件名称"`
	VideoPlaySeconds string `description:"音频播放时长"`
	VideoSize        string `description:"音频文件大小,单位M"`
	VideoKind        int    `description:"音频生成方式:1,手动上传,2:自动生成"`
	PublishTime      string `description:"发布时间"`
	CreateTime       string `description:"创建时间"`
	ModifyTime       string `description:"修改时间"`
}

// GetChapterListByReportId 根据ReportId获取章节列表
func GetChapterListByReportId(reportId int) (list []*ReportChapter, err error) {
	o := orm.NewOrmUsingDB("rddp")
	sql := ` SELECT * FROM report_chapter WHERE report_id = ? ORDER BY sort ASC`
	_, err = o.Raw(sql, reportId).QueryRows(&list)

	return
}

// GetPublishedChapterListByReportId 根据ReportId获取已发布章节列表
func GetPublishedChapterListByReportId(reportId int) (list []*ReportChapter, err error) {
	o := orm.NewOrmUsingDB("rddp")
	sql := ` SELECT * FROM report_chapter WHERE report_id = ? AND publish_state = 2 ORDER BY sort ASC`
	_, err = o.Raw(sql, reportId).QueryRows(&list)

	return
}

// EditReportChapterReq 编辑报告章节请求体
type EditReportChapterReq struct {
	ReportChapterId  int            `description:"报告章节ID"`
	Title            string         `description:"标题"`
	AddType          int            `description:"新增方式:1:新增报告,2:继承报告"`
	Author           string         `description:"作者"`
	Content          string         `description:"内容"`
	TickerList       []EditTickList `description:"指标信息"`
	CreateTime       string         `description:"发布时间"`
	VideoUrl         string         `description:"音频文件URL"`
	VideoName        string         `description:"音频文件名称"`
	VideoPlaySeconds string         `description:"音频播放时长"`
	VideoSize        string         `description:"音频文件大小,单位M"`
}

type EditTickList struct {
	Label  string
	Ticker string
	Sort   int
}

// GetReportChapterInfoById 根据主键获取报告章节
func GetReportChapterInfoById(reportChapterId int) (item *ReportChapter, err error) {
	o := orm.NewOrmUsingDB("rddp")
	sql := ` SELECT * FROM report_chapter WHERE report_chapter_id = ? `
	err = o.Raw(sql, reportChapterId).QueryRow(&item)

	return
}

// GetLastPublishedReportChapter 获取上一篇已发表的晨周报章节
func GetLastPublishedReportChapter(typeId int, reportType string) (item *ReportChapter, err error) {
	o := orm.NewOrmUsingDB("rddp")
	sql := ` SELECT * FROM report_chapter WHERE publish_state = 2 AND type_id = ? AND report_type = ? ORDER BY report_chapter_id DESC limit 1 `
	err = o.Raw(sql, typeId, reportType).QueryRow(&item)

	return
}

// UpdateChapter 更新报表章节
func (chapterInfo *ReportChapter) UpdateChapter(cols []string) (err error) {
	o := orm.NewOrmUsingDB("rddp")
	_, err = o.Update(chapterInfo, cols...)

	return
}

// EditChapterTrendTagReq 编辑章节趋势标签请求体
type EditChapterTrendTagReq struct {
	ReportChapterId int    `description:"章节ID"`
	Trend           string `description:"趋势"`
}

// UpdateChapterAndTicker 更新章节及ticker
func UpdateChapterAndTicker(chapterInfo *ReportChapter, updateCols []string, tickerList []*ReportChapterTicker) (err error) {
	o := orm.NewOrmUsingDB("rddp")
	to, err := o.Begin()
	if err != nil {
		return
	}
	defer func() {
		if err != nil {
			_ = to.Rollback()
		} else {
			_ = to.Commit()
		}
	}()

	// 更新章节
	if err = chapterInfo.UpdateChapter(updateCols); err != nil {
		return
	}
	// 清空并新增章节ticker
	if err = ClearReportChapterTicker(chapterInfo.ReportChapterId); err != nil {
		return
	}
	tickerLen := len(tickerList)
	if tickerLen > 0 {
		for i := 0; i < tickerLen; i++ {
			_, tmpErr := InsertChapterTicker(tickerList[i])
			if tmpErr != nil {
				return
			}
		}
	}

	return
}

// ReportChapterVideoList 报告章节音频列表
type ReportChapterVideoList struct {
	ReportId         int    `description:"报告ID"`
	ReportChapterId  int    `description:"报告章节ID"`
	VideoUrl         string `description:"音频文件URL"`
	VideoName        string `description:"音频文件名称"`
	VideoPlaySeconds string `description:"音频播放时长"`
}

// GetReportChapterVideoList 获取报告章节音频列表
func GetReportChapterVideoList(reportId int) (list []*ReportChapterVideoList, err error) {
	o := orm.NewOrmUsingDB("rddp")
	sql := ` SELECT
				report_id,
				report_chapter_id,
				video_url,
				video_name,
				video_play_seconds
			FROM
				report_chapter
			WHERE
				report_id = ? AND publish_state = 2 AND video_url != ""
			ORDER BY
				report_chapter_id ASC `
	_, err = o.Raw(sql, reportId).QueryRows(&list)

	return
}

// GetReportChapterVideoListByReportIds 根据报告ID集合获取报告章节音频列表
func GetReportChapterVideoListByReportIds(reportIds string) (list []*ReportChapterVideoList, err error) {
	o := orm.NewOrmUsingDB("rddp")
	sql := ` SELECT
				report_id,
				report_chapter_id,
				video_url,
				video_name,
				video_play_seconds
			FROM
				report_chapter
			WHERE
				report_id IN (` + reportIds + `) AND publish_state = 2 AND video_url != ""
			ORDER BY
				report_chapter_id ASC `
	_, err = o.Raw(sql).QueryRows(&list)

	return
}

// GetReportChapterVideoListByChapterIds 根据章节ID集合获取报告章节音频列表
func GetReportChapterVideoListByChapterIds(chapterIds string) (list []*ReportChapterVideoList, err error) {
	o := orm.NewOrmUsingDB("rddp")
	sql := ` SELECT
				report_id,
				report_chapter_id,
				video_url,
				video_name,
				video_play_seconds
			FROM
				report_chapter
			WHERE
				report_chapter_id IN (` + chapterIds + `) AND publish_state = 2
			ORDER BY
				report_chapter_id ASC `
	_, err = o.Raw(sql).QueryRows(&list)

	return
}

// PublishReportChapterReq 发布报告章节请求体
type PublishReportChapterReq struct {
	ReportChapterId  int            `description:"报告章节ID"`
	Title            string         `description:"标题"`
	AddType          int            `description:"新增方式:1:新增报告,2:继承报告"`
	Author           string         `description:"作者"`
	Content          string         `description:"内容"`
	TickerList       []EditTickList `description:"指标信息"`
	CreateTime       string         `description:"发布时间"`
	PublishReport    int            `description:"是否同时发布报告"`
	VideoUrl         string         `description:"音频文件URL"`
	VideoName        string         `description:"音频文件名称"`
	VideoPlaySeconds string         `description:"音频播放时长"`
	VideoSize        string         `description:"音频文件大小,单位M"`
}

// CountPublishedChapterNum 获取报告已发布的章节数
func CountPublishedChapterNum(reportId int) (count int, err error) {
	o := orm.NewOrmUsingDB("rddp")
	sql := ` SELECT COUNT(1) AS ct FROM report_chapter WHERE report_id = ? AND publish_state = 2 `
	err = o.Raw(sql, reportId).QueryRow(&count)

	return
}

// GetChapterListByReportId 根据ReportId获取章节列表
func GetChapterListByChapterIds(chapterIds string) (list []*ReportChapter, err error) {
	o := orm.NewOrmUsingDB("rddp")
	sql := ` SELECT * FROM report_chapter WHERE report_chapter_id IN (` + chapterIds + `) ORDER BY sort ASC`
	_, err = o.Raw(sql).QueryRows(&list)
	return
}

// GetChapterSimpleListByChapterIds 根据章节ID获取章节列表
func GetChapterSimpleListByChapterIds(chapterIds string) (list []*ReportChapter, err error) {
	o := orm.NewOrmUsingDB("rddp")
	sql := ` SELECT report_id, report_chapter_id, title, type_name, create_time, IF(publish_time,publish_time,create_time) as publish_time FROM report_chapter WHERE report_chapter_id IN (` + chapterIds + `) ORDER BY publish_time desc, sort ASC`
	_, err = o.Raw(sql).QueryRows(&list)
	return
}

// GetChapterSimpleListByReportIds 根据ReportId获取章节列表
func GetChapterSimpleListByReportIds(reportIds string) (list []*ReportChapter, err error) {
	o := orm.NewOrmUsingDB("rddp")
	sql := ` SELECT report_id, report_chapter_id, title, type_name, create_time, IF(publish_time,publish_time,create_time) as publish_time FROM report_chapter WHERE publish_state = 2 and report_id IN (` + reportIds + `) ORDER BY publish_time desc, sort ASC`
	_, err = o.Raw(sql).QueryRows(&list)
	return
}

// UpdateReportChapterTypeNameByTypeId 更新章节类型名称
func UpdateReportChapterTypeNameByTypeId(typeId int, typeName string) (err error) {
	o := orm.NewOrmUsingDB("rddp")
	sql := `UPDATE report_chapter SET type_name = ? WHERE type_id = ?`
	_, err = o.Raw(sql, typeName, typeId).Exec()
	return
}

// CountReportChapterByTypeId 通过章节类型ID获取章节数
func CountReportChapterByTypeId(typeId int) (count int, err error) {
	o := orm.NewOrmUsingDB("rddp")
	sql := ` SELECT COUNT(1) AS ct FROM report_chapter WHERE type_id = ?`
	err = o.Raw(sql, typeId).QueryRow(&count)
	return
}