package cygx

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

type CygxActivityAppointment struct {
	Id          int       `orm:"column(id);pk"`
	ActivityId  int       `description:"活动ID"`
	UserId      int       `description:"用户ID"`
	AdminId     int       `description:"管理员ID"`
	CreateTime  time.Time `description:"创建时间"`
	Mobile      string    `description:"手机号"`
	Email       string    `description:"邮箱"`
	CompanyId   int       `description:"公司id"`
	CompanyName string    `description:"公司名称"`
	RealName    string    `description:"用户实际名称"`
	SellerName  string    `description:"所属销售"`
	Source      int       `description:"来源,1小程序,2后台添加"`
}

// 取消纪要预约
func CancelcygxActivityAppointment(item *CygxActivityAppointment) (lastId int64, err error) {
	o, err := orm.NewOrmUsingDB("hz_cygx").Begin()
	if err != nil {
		return
	}
	defer func() {
		fmt.Println(err)
		if err == nil {
			o.Commit()
		} else {
			o.Rollback()
		}
	}()
	//判断是否删除我的日程
	var countSingup int
	var countReminder int
	sql := `SELECT COUNT(1) AS count FROM cygx_activity_signup WHERE  is_cancel = 0  AND user_id=? AND activity_id=? `
	err = o.Raw(sql, item.UserId, item.ActivityId).QueryRow(&countSingup)
	sql = `SELECT COUNT(1) AS count FROM cygx_activity_meeting_reminder WHERE   user_id=? AND activity_id=? `
	err = o.Raw(sql, item.UserId, item.ActivityId).QueryRow(&countReminder)
	if err != nil {
		return
	}
	if countSingup == 0 && countReminder == 0 {
		sql = `DELETE  FROM cygx_my_schedule   WHERE user_id=?  AND activity_id=? `
		_, err = o.Raw(sql, item.UserId, item.ActivityId).Exec()
		if err != nil {
			return
		}
	}
	//删除预约的纪要
	sql = `DELETE  FROM cygx_activity_appointment   WHERE user_id=?  AND activity_id=? `
	_, err = o.Raw(sql, item.UserId, item.ActivityId).Exec()
	if err != nil {
		return
	}
	return
}

// 预约纪要的人数列表
func GetCygxAppointmentSummaryList(activityId int, sqlStr string) (item []*CygxAppointmentList, err error) {
	o := orm.NewOrmUsingDB("hz_cygx")
	sql := `SELECT s.*,a.activity_time
			FROM
			cygx_activity_appointment AS s
			LEFT JOIN cygx_activity AS a ON a.activity_id = s.activity_id
			WHERE a.activity_id = ?  ` + sqlStr + `  GROUP BY s.user_id   ORDER BY s.create_time DESC `
	_, err = o.Raw(sql, activityId).QueryRows(&item)
	return
}

// 预约纪要的人数数量
func GetCygxAppointmentSummaryCount(activityId int, sqlStr string) (count int, err error) {
	o := orm.NewOrmUsingDB("hz_cygx")
	sql := `SELECT COUNT(*) FROM
			cygx_activity_appointment AS s
			LEFT JOIN cygx_activity AS a ON a.activity_id = s.activity_id
			WHERE
			s.activity_id = ? ` + sqlStr + `
            GROUP BY s.user_id)`
	sql = `SELECT COUNT(*)  as count FROM (` + sql + ` a`
	err = o.Raw(sql, activityId).QueryRow(&count)
	return
}

// 通过ID获取预约纪要详情
func GetCygxAppointmentSummaryInfoById(id int) (item *CygxActivityAppointment, err error) {
	o := orm.NewOrmUsingDB("hz_cygx")
	sql := `SELECT * FROM cygx_activity_appointment  WHERE id=?`
	err = o.Raw(sql, id).QueryRow(&item)
	return
}

// 获取某一用户的报名的数量
func GetUserCygxActivityAppointmentCount(uid, activityId int) (count int, err error) {
	sqlCount := `SELECT COUNT(1) AS count FROM cygx_activity_appointment  WHERE  user_id=?  AND   activity_id =? `
	o := orm.NewOrmUsingDB("hz_cygx")
	err = o.Raw(sqlCount, uid, activityId).QueryRow(&count)
	return
}

// 添加预约纪要
func AddCygxActivityAppointmentUser(items []*CygxActivityAppointment) (err error) {
	o := orm.NewOrmUsingDB("hz_cygx")
	to, err := o.Begin()
	if err != nil {
		return
	}
	defer func() {
		if err != nil {
			fmt.Println(err)
			_ = to.Rollback()
		} else {
			_ = to.Commit()
		}
	}()
	for _, item := range items {
		var count int
		sql := `SELECT COUNT(1) AS count FROM cygx_my_schedule WHERE user_id=? AND activity_id=? `
		err = to.Raw(sql, item.UserId, item.ActivityId).QueryRow(&count)
		if err != nil {
			return
		}
		if count == 0 {
			itemMy := new(CygxMySchedule)
			itemMy.UserId = item.UserId
			itemMy.ActivityId = item.ActivityId
			itemMy.CreateTime = time.Now()
			itemMy.Mobile = item.Mobile
			itemMy.Email = item.Email
			itemMy.CompanyId = item.CompanyId
			itemMy.CompanyName = item.CompanyName
			_, err = to.Insert(itemMy)
			if err != nil {
				return
			}
		}
		sql = `SELECT COUNT(1) AS count FROM cygx_activity_appointment WHERE user_id=? AND activity_id=? `
		err = to.Raw(sql, item.UserId, item.ActivityId).QueryRow(&count)
		if err != nil {
			return
		}
		if count == 0 {
			_, err = to.Insert(item)
		}
	}
	return
}

type CygxAppointmentMobileList struct {
	ActivityId   int    `description:"活动ID"`
	Mobile       string `description:"手机号"`
	ActivityName string `description:"活动名称"`
}

// 通过活动ID获取预约纪要的人数列表
func GetCygxAppointmentSummaryListBySubjectId(subjectIds string) (item []*CygxAppointmentMobileList, err error) {
	o := orm.NewOrmUsingDB("hz_cygx")
	sql := `SELECT
			ap.mobile,
			ap.activity_id,
			a.activity_name 
		FROM
			cygx_activity_appointment AS ap
			INNER JOIN cygx_activity AS a ON a.activity_id = ap.activity_id
			INNER JOIN cygx_industrial_activity_group_subject AS sg ON sg.activity_id = a.activity_id 
		WHERE
			a.active_state = 3 
			AND a.chart_permission_id = 31 
			AND DATE_SUB( CURDATE(), INTERVAL 14 DAY ) <= date( a.activity_time ) 
			AND a.activity_type_id = 1 
			AND sg.industrial_subject_id IN (` + subjectIds + `) 
		GROUP BY
			ap.mobile,
			ap.activity_id `
	_, err = o.Raw(sql).QueryRows(&item)
	return
}

// 获取预约活动纪要的的用户的openID
func GetActivityAppointmentOpenIdList(activityId int) (items []*OpenIdList, err error) {
	o := orm.NewOrmUsingDB("hz_cygx")
	var sql string
	sql = `SELECT DISTINCT
				u.open_id,
				u.cygx_user_id AS user_id 
			FROM
				cygx_activity_appointment AS m
				INNER JOIN cygx_user_record AS u ON u.cygx_bind_account = m.mobile 
				AND u.cygx_user_id = m.user_id 
			WHERE
				m.activity_id = ? `
	_, err = o.Raw(sql, activityId).QueryRows(&items)
	return
}


// 获取预约活动纪要的的用户的openID
func GetMfyxActivityAppointmentOpenIdList(activityId int) (items []*OpenIdList, err error) {
	o := orm.NewOrmUsingDB("hz_cygx")
	var sql string
	sql = `SELECT DISTINCT
				u.open_id,
				u.cygx_user_id AS user_id 
			FROM
				cygx_activity_appointment AS m
				INNER JOIN cygx_mfyx_gzh_user_record AS u ON u.cygx_bind_account = m.mobile 
				AND u.cygx_user_id = m.user_id 
			WHERE
				m.activity_id = ? `
	_, err = o.Raw(sql, activityId).QueryRows(&items)
	return
}