package roadshow

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

//公开会议总览

type PublicMeetingView struct {
	RsCalendarId int    `description:"日历活动id"`
	MinTime      string `description:"活动最小时间"`
	MaxTime      string `description:"活动最大时间"`
}

//获取公开会议
func GetPublicMeetingList(endDate string) (list []*PublicMeetingView, err error) {
	sql := ` SELECT a.rs_calendar_id,min(DATE_FORMAT(CONCAT(b.start_date," ",b.start_time),'%Y-%m-%d %H:%i:%S')) AS min_time,max(DATE_FORMAT(CONCAT(b.end_date," ",b.end_time),'%Y-%m-%d %H:%i:%S')) AS max_time
			FROM rs_calendar AS a
			INNER JOIN rs_calendar_researcher AS b ON a.rs_calendar_id=b.rs_calendar_id
			WHERE a.source=0 AND activity_type='公开会议'
			AND b.end_date>=?
			group by a.rs_calendar_id  `
	o := orm.NewOrm()
	_, err = o.Raw(sql, endDate).QueryRows(&list)
	return
}

func ModifyCalendarUnionCode(unionCode string, rsCalendarId int) (err error) {
	sql := ` UPDATE rs_calendar SET union_code=? WHERE rs_calendar_id=? `
	o := orm.NewOrm()
	_, err = o.Raw(sql, unionCode, rsCalendarId).Exec()
	if err != nil {
		return err
	}
	sql = ` UPDATE rs_calendar_researcher SET union_code=? WHERE rs_calendar_id=? `
	_, err = o.Raw(sql, unionCode, rsCalendarId).Exec()
	if err != nil {
		return err
	}
	return
}

func GetCoincideMeeting(startTime, endTime string) (list []*PublicMeetingView, err error) {
	sql := ` SELECT * FROM (
			SELECT a.rs_calendar_id,MIN(DATE_FORMAT(CONCAT(b.start_date," ",b.start_time),'%Y-%m-%d %H:%i:%S')) AS min_time,MAX(DATE_FORMAT(CONCAT(b.end_date," ",b.end_time),'%Y-%m-%d %H:%i:%S')) AS max_time
						FROM rs_calendar AS a
						INNER JOIN rs_calendar_researcher AS b ON a.rs_calendar_id=b.rs_calendar_id
						WHERE a.source=0 AND activity_type='公开会议'
						GROUP BY a.rs_calendar_id
			) AS t
			WHERE (t.min_time<=? AND t.max_time>=?) OR (?>=t.min_time AND ?<=t.max_time) or 
(t.min_time >= ? AND t.max_time <=?) `
	o := orm.NewOrm()
	_, err = o.Raw(sql, startTime, startTime, endTime, endTime, startTime, endTime).QueryRows(&list)
	return
}

func GetCoincideMeetingMinAndMaxTime(startTime, endTime string) (min_time, max_time string, err error) {
	sql := ` select min(t.min_time) as min_time,max(t.max_time) as max_time from (
			SELECT a.rs_calendar_id,MIN(DATE_FORMAT(CONCAT(b.start_date," ",b.start_time),'%Y-%m-%d %H:%i:%S')) AS min_time,MAX(DATE_FORMAT(CONCAT(b.end_date," ",b.end_time),'%Y-%m-%d %H:%i:%S')) AS max_time
						FROM rs_calendar AS a
						INNER JOIN rs_calendar_researcher AS b ON a.rs_calendar_id=b.rs_calendar_id
						WHERE a.source=0 AND activity_type='公开会议'
						GROUP BY a.rs_calendar_id
			)as t
			where (t.min_time<=? AND t.max_time>=?) OR (?>=t.min_time AND ?<=t.max_time) `
	o := orm.NewOrm()
	err = o.Raw(sql, startTime, startTime, endTime, endTime).QueryRow(&min_time, &max_time)
	return
}

func ClearCalendarUnionCode(nowDate string) (err error) {
	o := orm.NewOrm()
	var rs_calendar_id string
	sql := `SELECT group_concat(distinct a.rs_calendar_id) AS rs_calendar_id FROM rs_calendar AS a
			INNER JOIN rs_calendar_researcher AS b ON a.rs_calendar_id=b.rs_calendar_id
			WHERE a.source=0 AND activity_type='公开会议'
			AND b.end_date>=? `
	err = o.Raw(sql, nowDate).QueryRow(&rs_calendar_id)

	sql = ` UPDATE rs_calendar SET union_code='' WHERE rs_calendar_id IN(` + rs_calendar_id + `) `

	_, err = o.Raw(sql).Exec()
	if err != nil {
		return err
	}
	sql = ` UPDATE rs_calendar_researcher SET union_code='' WHERE rs_calendar_id IN(` + rs_calendar_id + `) `
	_, err = o.Raw(sql).Exec()
	if err != nil {
		return err
	}
	return
}

/*
sql := ` SELECT b.* FROM rs_calendar AS a
			INNER JOIN rs_calendar_researcher AS b ON a.rs_calendar_id=b.rs_calendar_id
			WHERE a.source=0 AND activity_type='公开会议'
			AND b.end_date>=?
			ORDER BY a.rs_calendar_id ASC  `
*/

func GetExistMeetingCode(startTime, endTime string) (union_code string, err error) {
	sql := ` SELECT union_code FROM rs_calendar_researcher AS a
			WHERE DATE_FORMAT(CONCAT(a.start_date," ",a.start_time),'%Y-%m-%d %H:%i:%S')>=?
			AND DATE_FORMAT(CONCAT(a.end_date," ",a.end_time),'%Y-%m-%d %H:%i:%S')<=?
			group by a.union_code
			LIMIT 1 `
	o := orm.NewOrm()
	err = o.Raw(sql, startTime, endTime).QueryRow(&union_code)
	return
}