package services

import (
	"eta/eta_mini_crm_ht/models"
	"eta/eta_mini_crm_ht/utils"
	"strings"
)

func GetUserSourceClickFlowListCountByUserId(userId int, condition string, pars []interface{}, permissionIds []int, product models.SourceType) (total int, conditionNew string, parsNew []interface{}, err error) {
	if len(permissionIds) == 0 {
		total, err = models.GetUserSourceClickFlowListCountByUserId(userId, condition, pars)
		conditionNew = condition
		parsNew = pars
		return
	}
	if product == models.AudioSourceType || product == models.VideoSourceType {
		mediaType := transMediaType(product)
		videoIds, queryErr := GetMediaIdsByPermissionIds(permissionIds, mediaType)
		if queryErr != nil || len(videoIds) == 0 {
			return
		}
		condition = condition + " and source_id in (" + utils.GetOrmReplaceHolder(len(videoIds)) + ") "
		pars = append(pars, videoIds)
	} else if product == models.ReportSourceType {
		reportIds, queryErr := GetReportIdsByPermissionIds(permissionIds)
		if queryErr != nil || len(reportIds) == 0 {
			return
		}
		condition = condition + " and source_id in (" + utils.GetOrmReplaceHolder(len(reportIds)) + ") "
		pars = append(pars, reportIds)
	} else {
		reportIds, reportErr := GetReportIdsByPermissionIds(permissionIds)
		addReport := false
		addVideo := false
		addAudio := false
		var permissionCondition string
		var permissionPars []interface{}
		if reportErr == nil && len(reportIds) > 0 {
			permissionCondition = permissionCondition + " (source_id in (" + utils.GetOrmReplaceHolder(len(reportIds)) + ") and source_type=?)"
			permissionPars = append(permissionPars, reportIds)
			permissionPars = append(permissionPars, models.ReportSourceType)
			addReport = true
		}
		videoIds, videoErr := GetMediaIdsByPermissionIds(permissionIds, models.Video)
		if videoErr == nil && len(videoIds) > 0 {
			if addReport {
				permissionCondition = permissionCondition + "or (source_id in (" + utils.GetOrmReplaceHolder(len(videoIds)) + ") and source_type=?)"
			} else {
				permissionCondition = permissionCondition + " (source_id in (" + utils.GetOrmReplaceHolder(len(videoIds)) + ") and source_type=?)"
			}
			permissionPars = append(permissionPars, videoIds)
			permissionPars = append(permissionPars, models.VideoSourceType)
			addVideo = true
		}
		audioIds, audioErr := GetMediaIdsByPermissionIds(permissionIds, models.Audio)
		if audioErr == nil && len(audioIds) > 0 {
			if addReport || addVideo {
				permissionCondition = permissionCondition + "or (source_id in (" + utils.GetOrmReplaceHolder(len(audioIds)) + ") and source_type=?)"
			} else {
				permissionCondition = permissionCondition + " (source_id in (" + utils.GetOrmReplaceHolder(len(audioIds)) + ") and source_type=?)"
			}
			permissionPars = append(permissionPars, audioIds)
			permissionPars = append(permissionPars, models.AudioSourceType)
			addAudio = true
		}
		if addReport || addVideo || addAudio {
			condition = condition + " and ( " + permissionCondition + " ) "
			pars = append(pars, permissionPars...)
		}
	}
	if condition == "" {
		utils.FileLog.Warn("没有符合要求的阅读记录")
		return
	}
	total, err = models.GetUserSourceClickFlowListCountByUserId(userId, condition, pars)
	conditionNew = condition
	parsNew = pars
	return
}

func GetUserSourceClickFlowListByUserId(userId int, condition string, pars []interface{}, startSize, pageSize int) (items []models.UserSourceClickFlowView, err error) {
	list, err := models.GetUserSourceClickFlowListByUserId(userId, condition, pars, startSize, pageSize)
	if err != nil {
		return
	}
	for _, item := range list {
		viewItem := item.ToView()
		switch item.SourceType {
		case models.ReportSourceType:
			viewItem.PermissionNames = getReportPermissionNames(item.SourceId)
		case models.AudioSourceType, models.VideoSourceType:
			mediaType := transMediaType(item.SourceType)
			viewItem.PermissionNames = getMediaPermissionNames(item.SourceId, mediaType)
		}
		items = append(items, viewItem)
	}
	return
}
func transMediaType(sourceType models.SourceType) models.MediaType {
	switch sourceType {
	case models.AudioSourceType:
		return models.Audio
	case models.VideoSourceType:
		return models.Video
	default:
		return ""
	}
}
func getReportPermissionNames(reportId int) (permissionNames string) {
	report, err := models.GetReportById(reportId)
	if err != nil {
		return
	}
	if report.Source == models.SourceETA {
		permissionIds, queryErr := models.GetByPermissionIdsByClassifyId(report.ClassifyId)
		if queryErr != nil {
			return
		}
		permissionNameList, nameErr := models.GetPermissionNames(permissionIds)
		if nameErr != nil {
			utils.FileLog.Error("获取品种名称列表失败", err.Error())
			return
		}
		if len(permissionNameList) > 0 {
			permissionNames = strings.Join(permissionNameList, ",")
		}
		return
	}
	if report.Source == models.SourceHT {
		return report.PlateName
	}
	return
}

func getMediaPermissionNames(mediaId int, mediaType models.MediaType) (permissionNames string) {
	media, err := models.GetMediaById(mediaType, mediaId)
	if err != nil {
		utils.FileLog.Error("获取媒体失败,Err:" + err.Error())
		return
	}
	permissionIds, queryErr := models.GetPermissionIdsByMediaId(media.MediaType, media.Id)
	if queryErr != nil {
		utils.FileLog.Error("获取媒体权限失败,Err:" + queryErr.Error())
		return
	}
	permissionNameList, nameErr := models.GetPermissionNames(permissionIds)
	if nameErr != nil {
		utils.FileLog.Error("获取品种名称列表信息失败", nameErr.Error())
		return
	}
	permissionNames = strings.Join(permissionNameList, ",")
	return
}