package cygx

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

// 报名
type CygxActivityAttendanceDetail struct {
	AttendanceId int    `orm:"column(attendance_id);pk;"description:"主键ID"`
	ActivityId   int    `description:"活动ID"`
	RealName     string `description:"姓名"`
	Mobile       string `description:"手机号"`
	CompanyName  string `description:"公司名称"`
	CompanyId    int    `description:"公司id 不在数据库的用户为0"`
	SellerName   string `description:"销售姓名"`
	//IsMeetingStr          string `description:"是否到会"`
	FirstMeetingTime      string    `description:"首次入会时间"`
	LastMeetingTime       string    `description:"最后退出时间"`
	Duration              string    `description:"参会时长"`
	MeetingTypeStr        string    `description:"参会方式"`
	MeetingAuthentication string    `description:"参会权鉴"`
	MeetingStatusStr      string    `description:"参会状态"`
	CreateTime            time.Time `description:"创建时间"`
	Position              string    `description:"职位"`
	IsMeetingStr          int       `description:"是否到会,1到会,0未到会"`
	UseridEntity          int       `description:"参会者身份. 1:主讲人, 2:主持人, 3:嘉宾, 4:普通参会者, 5:联席主讲人, 6:会议助理"`
	CrmCompanyMapStatusId int       `description:"转换后的对应状态信息:1=正式客户, 2=曾使用客户, 3=其他"`
	ActivityTime          string    `description:"活动时间"`
}

// 报名
type AttendanceDetail struct {
	ActivityId            int    `description:"活动ID"`
	RealName              string `description:"姓名"`
	Mobile                string `description:"手机号"`
	CompanyName           string `description:"公司名称"`
	CompanyId             int    `description:"公司ID"`
	SellerName            string `orm:"column(pseller_name);"description:"销售姓名"`
	IsMeeting             int    `description:"是否到会"`
	FirstMeetingTime      string `description:"首次入会时间"`
	LastMeetingTime       string `description:"最后退出时间"`
	Duration              string `description:"参会时长"`
	MeetingTypeStr        string `description:"参会方式"`
	MeetingAuthentication string `description:"参会权鉴"`
	MeetingStatusStr      string `description:"参会状态"`
	Position              string `description:"职位"`
	OutboundMobile        string `description:"外呼手机号"`
	CountryCode           string `description:"手机国家区号"`
	UseridEntity          int    `description:"参会者身份. 1:主讲人, 2:主持人, 3:嘉宾, 4:普通参会者, 5:联席主讲人, 6:会议助理"`
	Content               string `description:"备注信息"`
	ActivityTimeText      string `description:"活动时间带文字"`
	ActivityName          string `description:"活动名称"`
}

func AddAttendancDetail(items []*CygxActivityAttendanceDetail, activityId int, mobileStr string) (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()
		}
	}()
	//修改活动是否上传到会信息字段
	sql := `UPDATE cygx_activity SET  is_submit_meeting=1   WHERE activity_id=? `
	_, err = to.Raw(sql, activityId).Exec()
	if err != nil {
		return
	}
	//修改单个报名信息是否到会
	sql = `UPDATE cygx_activity_signup SET  is_meeting=0   WHERE activity_id=? `
	_, err = to.Raw(sql, activityId).Exec()
	if err != nil {
		return
	}
	sql = `UPDATE cygx_activity_signup SET  is_meeting=1   WHERE  activity_id=? AND outbound_mobile IN (` + mobileStr + `)`
	_, err = to.Raw(sql, activityId).Exec()
	if err != nil {
		return
	}
	sql = `UPDATE cygx_activity_signup SET  is_meeting=1   WHERE  activity_id=? AND mobile IN (` + mobileStr + `)`
	_, err = to.Raw(sql, activityId).Exec()
	if err != nil {
		return
	}
	//二次上传时删除原有数据
	sql = ` DELETE FROM cygx_activity_attendance_detail WHERE activity_id = ?`
	_, err = to.Raw(sql, activityId).Exec()
	if err != nil {
		return
	}
	//插入提交信息
	//for _, v := range items {
	//	_, err = to.Insert(v)
	//	if err != nil {
	//		return
	//	}
	//}

	_, err = o.InsertMulti(len(items), items)
	if err != nil {
		return err
	}
	return
}

func GetAttendanceDetailList(activityId int, sqlStr string) (item []*AttendanceDetail, err error) {
	o := orm.NewOrmUsingDB("hz_cygx")
	sql := `SELECT s.id,s.activity_id,p.company_name,s.mobile,s.is_meeting,s.outbound_mobile,s.country_code,u.real_name,d.first_meeting_time,d.last_meeting_time,d.meeting_type_str,d.meeting_authentication,d.meeting_status_str,d.duration,d.userid_entity,
			GROUP_CONCAT( DISTINCT p.seller_name SEPARATOR '/' ) AS pseller_name
			FROM
			cygx_activity_signup AS s
			INNER JOIN wx_user AS u ON u.user_id = s.user_id
			INNER JOIN cygx_activity AS a ON a.activity_id = s.activity_id
			INNER JOIN company_product AS p ON p.company_id = s.company_id 
			LEFT JOIN cygx_activity_attendance_detail AS d ON d.mobile = s.outbound_mobile  AND s.activity_id = d.activity_id
			WHERE 1 = 1 
			AND s.fail_type = 0 
			AND s.is_cancel = 0
			AND d.userid_entity != 3
			AND s.activity_id = ?` + sqlStr + `  GROUP BY s.id  ORDER BY s.is_meeting DESC`
	_, err = o.Raw(sql, activityId).QueryRows(&item)
	return
}

func GetAttendanceDetailListGroup(activityId int, sqlStr string) (item []*AttendanceDetail, err error) {
	o := orm.NewOrmUsingDB("hz_cygx")
	sql := `SELECT s.*,d.first_meeting_time,d.last_meeting_time,d.meeting_type_str,d.meeting_authentication,d.meeting_status_str,d.duration,d.userid_entity,d.userid_entity
			FROM
			cygx_activity_signup AS s
			LEFT JOIN cygx_activity AS a ON a.activity_id = s.activity_id
			LEFT JOIN cygx_activity_attendance_detail AS d ON ( d.mobile = s.outbound_mobile   OR d.mobile = s.mobile )  AND s.activity_id = d.activity_id
			WHERE 1 = 1 
			AND s.do_fail_type = 0 
			AND s.is_cancel = 0
			AND s.activity_id = ?` + sqlStr + `  ORDER BY s.is_meeting DESC`
	_, err = o.Raw(sql, activityId).QueryRows(&item)
	return
}

func GetAttendanceDetailListGroupByUser(mobile, sqlStr string) (item []*AttendanceDetail, err error) {
	o := orm.NewOrmUsingDB("hz_cygx")
	sql := `SELECT s.id,s.activity_id,s.company_name,s.mobile,s.is_meeting,s.outbound_mobile,s.country_code,s.real_name,s.first_meeting_time,s.last_meeting_time,s.meeting_type_str,s.meeting_authentication,s.meeting_status_str,s.duration,s.userid_entity,s.userid_entity,a.activity_name,a.activity_time_text
			FROM
			cygx_activity_signup_detail AS s
			INNER JOIN cygx_activity AS a ON a.activity_id = s.activity_id
			WHERE 1 = 1 
			AND s.do_fail_type = 0 
			AND s.is_cancel = 0
			AND s.mobile = ?` + sqlStr + `  ORDER BY a.activity_time ASC `
	_, err = o.Raw(sql, mobile).QueryRows(&item)
	return
}

func GetAttendanceDetailList2(activityId int, sqlStr string) (item []*AttendanceDetail, err error) {
	o := orm.NewOrmUsingDB("hz_cygx")
	sql := `SELECT d.activity_id,d.real_name,d.company_id,d.first_meeting_time,d.last_meeting_time,d.meeting_type_str,d.meeting_authentication,d.meeting_status_str,d.mobile,d.duration,d.company_name,d.position,d.userid_entity
			FROM
			cygx_activity_attendance_detail AS d
			WHERE 1 = 1 AND d.activity_id = ? AND is_meeting_str = 1 AND d.userid_entity != 3  ` + sqlStr + ` GROUP BY d.mobile`
	_, err = o.Raw(sql, activityId).QueryRows(&item)
	return
}

func GetAttendanceDetailList3(activityId int, sqlStr string) (item []*AttendanceDetail, err error) {
	o := orm.NewOrmUsingDB("hz_cygx")
	sql := `SELECT d.activity_id,d.real_name,d.company_id,d.first_meeting_time,d.last_meeting_time,d.meeting_type_str,d.meeting_authentication,d.meeting_status_str,d.mobile,d.duration,d.company_name,d.position,d.userid_entity
			FROM
			cygx_activity_attendance_detail AS d
			WHERE 1 = 1 AND d.activity_id = ?  AND d.userid_entity != 3 AND d.crm_company_map_status_id != 1 ` + sqlStr + ` GROUP BY d.mobile`
	_, err = o.Raw(sql, activityId).QueryRows(&item)
	return
}

type AttendanceDetailList struct {
	List1 []*AttendanceDetail `description:"预约客户"`
	List2 []*AttendanceDetail `description:"未预约客户"`
	List3 []*AttendanceDetail `description:"潜在客户"`
}

type WxUserOutboundMobile struct {
	RealName       string `description:"姓名"`
	Mobile         string `description:"手机号"`
	OutboundMobile string `description:"外呼手机号"`
	CompanyId      int    `description:"公司ID"`
	CompanyName    string `description:"公司名称"`
	SellerName     string `description:"所属销售"`
	UserId         int    `description:"用户ID"`
}

func GetWxUserOutboundMobile(mobileStr string) (item []*WxUserOutboundMobile, err error) {
	o := orm.NewOrm()
	sql := `SELECT u.real_name,u.mobile,u.outbound_mobile,u.company_id,p.company_name ,GROUP_CONCAT( DISTINCT p.seller_name SEPARATOR '/' ) AS seller_name
			FROM wx_user as u 
			INNER JOIN company_product AS p ON p.company_id = u.company_id 
			WHERE outbound_mobile IN (` + mobileStr + `) GROUP BY u.user_id`
	_, err = o.Raw(sql).QueryRows(&item)
	return
}

func GetWxUserMobile(mobileStr string) (item []*WxUserOutboundMobile, err error) {
	o := orm.NewOrm()
	sql := `SELECT u.real_name,u.mobile,u.outbound_mobile,u.company_id,p.company_name ,GROUP_CONCAT( DISTINCT p.seller_name SEPARATOR '/' ) AS seller_name
			FROM wx_user as u 
			INNER JOIN company_product AS p ON p.company_id = u.company_id 
			WHERE mobile IN (` + mobileStr + `) GROUP BY u.user_id`
	_, err = o.Raw(sql).QueryRows(&item)
	return
}

type RoadshowData struct {
	Id                    int       `orm:"column(id);pk;"description:"主键ID"`
	Company               string    `description:"公司名称"`
	UserName              string    `description:"用户名"`
	UserPhone             string    `description:"手机号"`
	UserinfoUource        string    `description:"用户来源"`
	AuthInfo              string    `description:"用户参会鉴权"`
	GuestUsername         string    `description:"嘉宾名称, 多个用,隔开"`
	FirstWatchTime        string    `description:"首次观看时间"`
	LastWatchTime         string    `description:"最后观看时间"`
	RoadshowId            string    `description:"路演ID"`
	RoadshowTitle         string    `description:"路演标题"`
	RoadshowBeginTime     time.Time `description:"路演开始时间"`
	RoadshowEndTime       time.Time `description:"路演结束时间"`
	JoinTime              int       `description:"参与时长"`
	JoinType              int       `description:"参与方式, 1网络, 2电话"`
	DataType              int       `description:"数据类型: 1直播, 2回放"`
	Occupation            string    `description:"职位"`
	UseridEntity          int       `description:"参会者身份. 1:主讲人, 2:主持人, 3:嘉宾, 4:普通参会者, 5:联席主讲人, 6:会议助理"`
	CrmCompanyMapStatusId int       `description:"转换后的对应状态信息:1=正式客户, 2=曾使用客户, 3=其他"`
}

type RoadshowDataTitle struct {
	RoadshowTitle string `description:"路演标题"`
	ActivityTime  string `description:"活动时间"`
}

type RoadshowDataTitleList struct {
	List []*RoadshowDataTitle
}

type RoadshowDataTitleResp struct {
	KeyWord    string `description:"关键词"`
	ActivityId int    `description:"活动ID"`
}

func GetRoadshowDataTitleList(startTime, endTime, title string) (list []*RoadshowDataTitle, err error) {
	o := orm.NewOrmUsingDB("comein_data")
	sql := `SELECT roadshow_title, roadshow_begin_time as activity_time  FROM roadshow_data WHERE  roadshow_begin_time > ? AND  roadshow_end_time < ?   AND roadshow_title LIKE '%` + title + `%'  GROUP BY  roadshow_id `
	_, err = o.Raw(sql, startTime, endTime).QueryRows(&list)
	return
}

func GetRoadshowDataList(title, condition string) (list []*RoadshowData, err error) {
	o := orm.NewOrmUsingDB("comein_data")
	sql := `SELECT * FROM roadshow_data WHERE roadshow_title LIKE '%` + title + `%'` + condition
	_, err = o.Raw(sql).QueryRows(&list)
	return
}

// 客户参会记录
type CompanyMeetRep struct {
	ActivityId            int    `description:"活动Id"`
	RealName              string `description:"姓名"`
	Mobile                string `description:"手机号"`
	Email                 string `description:"邮箱"`
	ActivityName          string `description:"活动名称"`
	ChartPermissionName   string `description:"行业名称"`
	ActivityTypeName      string `description:"活动类型名称"`
	Label                 string `description:"标签"`
	ActivityTime          string `description:"活动时间"`
	FirstMeetingTime      string `description:"首次入会时间"`
	LastMeetingTime       string `description:"最后退出时间"`
	Duration              string `description:"参会时长"`
	MeetingTypeStr        string `description:"参会方式"`
	MeetingAuthentication string `description:"参会权鉴"`
	MeetingStatusStr      string `description:"参会状态"`
}

func GetCygxActivityAttendanceDetailByCompanyId(mobiles string) (list []*CompanyMeetRep, err error) {
	o := orm.NewOrmUsingDB("hz_cygx")
	sql := `SELECT
			a.*,
			s.mobile,
			s.real_name,
			d.first_meeting_time,
			d.last_meeting_time,
			d.duration,
			d.meeting_type_str,
			d.meeting_authentication,
			d.meeting_status_str
			FROM
			cygx_activity_signup AS s
			INNER  JOIN cygx_activity AS a ON a.activity_id = s.activity_id
			INNER JOIN cygx_activity_attendance_detail AS d ON d.activity_id = s.activity_id 
			INNER JOIN cygx_activity_type as t ON t.activity_type_id = a.activity_type_id
		WHERE
			1 = 1 
			AND s.do_fail_type = 0 
			AND s.is_cancel = 0 
			AND s.is_meeting = 1
			AND s.mobile IN (` + mobiles + `)
			AND a.is_submit_meeting = 1
			AND t.activity_type = 1
		GROUP BY
			s.id 
		ORDER BY
			a.activity_time DESC `
	_, err = o.Raw(sql).QueryRows(&list)
	return
}

func GetCygxActivityOfflineMeetingDetailByCompanyId(mobiles string) (list []*CompanyMeetRep, err error) {
	o := orm.NewOrmUsingDB("hz_cygx")
	sql := `SELECT
			a.*,s.mobile,s.email,s.real_name
		FROM
		    cygx_activity_signup AS s
			INNER  JOIN cygx_activity AS a ON a.activity_id = s.activity_id
			INNER JOIN cygx_activity_type as t ON t.activity_type_id = a.activity_type_id
		WHERE
			1 = 1 
			AND s.do_fail_type = 0 
			AND s.is_cancel = 0 
			AND s.is_meeting = 1
			AND s.mobile IN (` + mobiles + `)
			AND a.is_submit_meeting = 1
			AND t.activity_type = 0
		GROUP BY
			s.id
		ORDER BY
			a.activity_time DESC `
	_, err = o.Raw(sql).QueryRows(&list)
	return
}

func GetCompanyActivityCount(companyId int) (list []*CompanyMeetRep, err error) {
	o := orm.NewOrmUsingDB("hz_cygx")
	sql := `SELECT
			a.chart_permission_name,
			date_format( a.activity_time, '%Y-%m' ) AS activity_time
		FROM
			cygx_activity_attendance_detail AS r
			INNER JOIN cygx_activity AS a ON a.activity_id = r.activity_id 
		WHERE
			r.company_id = ? 
			AND is_meeting_str = 1 
		ORDER BY
			a.activity_time DESC`
	_, err = o.Raw(sql, companyId).QueryRows(&list)
	return
}

func GetCygxActivityOfflineMeetingCoount(companyId int) (list []*CompanyMeetRep, err error) {
	o := orm.NewOrmUsingDB("hz_cygx")
	sql := `SELECT
			a.chart_permission_name,
			date_format( a.activity_time, '%Y-%m' ) AS activity_time
		FROM
			cygx_activity_offline_meeting_detail  as r 
			INNER JOIN cygx_activity as a On a.activity_id = r.activity_id
		WHERE
			r.company_id =?  AND r.is_meeting = 1 ORDER BY a.activity_time DESC`
	_, err = o.Raw(sql, companyId).QueryRows(&list)
	return
}

// 列表
func GetCygxActivityAttendanceDetailList(condition string, pars []interface{}, startSize, pageSize int) (items []*CygxActivityAttendanceDetail, err error) {
	o := orm.NewOrmUsingDB("hz_cygx")
	sql := `SELECT * FROM cygx_activity_attendance_detail as a WHERE 1= 1 `
	if condition != "" {
		sql += condition
	}
	sql += ` LIMIT ?,?  `
	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
	return
}