package model

import (
	"fmt"
	"time"
)

// const const var
const (
	// up主操作
	StatUpperInit   = int8(0) // up主未处理
	StatUpperIgnore = int8(1) // up主已忽略
	StatUpperDelete = int8(2) // up主已删除

	// 管理员操作
	StatFirstInit        = int8(0) // 待一审
	StatFirstDelete      = int8(1) // 一审删除
	StatSecondInit       = int8(2) // 待二审
	StatSecondDelete     = int8(3) // 二审删除
	StatSecondIgnore     = int8(4) // 二审忽略
	StatFirstIgnore      = int8(5) // 一审忽略
	StatSecondAutoDelete = int8(6) // 二审脚本删除
	StatJudgeInit        = int8(7) // 风纪委待审(二审)
	StatJudgeDelete      = int8(8) // 风纪委删除(二审)
	StatJudgeIgnore      = int8(9) // 风纪委忽略(二审)

	// 处理结果通知
	NoticeUnsend = int8(0) // 未通知用户
	NoticeSend   = int8(1) // 已通知用户

	// 举报通知状态
	NoticeReporter = int8(1)
	NoticePoster   = int8(2)
	NoticeAll      = int8(3)

	// 举报原因
	ReportReasonProhibited  = int8(1)  // 违禁
	ReportReasonPorn        = int8(2)  // 色情
	RptReasonFraud          = int8(3)  // 赌博诈骗
	ReportReasonAttack      = int8(4)  // 人身攻击
	ReportReasonPrivate     = int8(5)  // 隐私
	ReportReasonAd          = int8(6)  // 广告
	ReportReasonWar         = int8(7)  // 引战
	ReportReasonSpoiler     = int8(8)  // 剧透
	ReportReasonMeaningless = int8(9)  // 刷屏
	ReportReasonUnrelated   = int8(10) // 视频不相关
	ReportReasonOther       = int8(11) // 其他
	ReportReasonTeenagers   = int8(12) // 青少年不良信息
)

// var const map
var (
	RptTemplate = map[string]string{
		"del":    `您好,您在视频#{%s}{"http://www.bilibili.com/av%d"}中举报的弹幕『%s』已被删除%s,原因是『%s』,感谢您对bilibili社区秩序的维护,哔哩哔哩 (゜-゜)つロ 干杯~`,
		"ignore": `您好,非常感谢您的举报,您在视频#{%s}{"http://www.bilibili.com/av%d"}中举报的弹幕『%s』暂未认定为违规内容,具体弹幕规范烦请参阅 #{《弹幕礼仪》}{"http://www.bilibili.com/blackboard/help.html#d5"},哔哩哔哩 (゜-゜)つロ 干杯~`,
	}
	PostTemplate = map[int8]string{
		1: `您好,根据用户举报,您在视频#{%s}{"http://www.bilibili.com/av%d"}中的弹幕『%s』已被删除%s,原因是『%s』,请自觉遵守国家相关法律法规,具体弹幕规范烦请参阅#{《弹幕礼仪》}{"http://www.bilibili.com/blackboard/help.html#d5"},bilibili良好的社区氛围需要大家一起维护!`,
		2: `您好,根据用户举报,您在视频#{%s}{"http://www.bilibili.com/av%d"}中的弹幕『%s』已被删除%s,原因是『%s』,bilibili倡导平等友善的交流,具体弹幕规范烦请参阅#{《弹幕礼仪》}{"http://www.bilibili.com/blackboard/help.html#d5"},良好的社区氛围需要大家一起维护!`,
		3: `您好,根据用户举报,您在视频#{%s}{"http://www.bilibili.com/av%d"}中的弹幕『%s』已被删除%s,原因是『%s』,弹幕是公众场所而非私人场所,具体弹幕规范烦请参阅#{《弹幕礼仪》}{"http://www.bilibili.com/blackboard/help.html#d5"},良好的社区氛围需要大家一起维护!`,
		4: `您好,根据用户举报,您在视频#{%s}{"http://www.bilibili.com/av%d"}中的弹幕『%s』已被删除%s,原因是『%s』,bilibili倡导发送与视频相关、有用的弹幕,具体弹幕规范烦请参阅#{《弹幕礼仪》}{"http://www.bilibili.com/blackboard/help.html#d5"},良好的社区氛围需要大家一起维护!`,
	}
	AdminRptReason = map[int8]string{
		1:  "内容涉及传播不实信息",
		2:  "内容涉及非法网站信息",
		3:  "内容涉及怂恿教唆信息",
		4:  "内容涉及低俗信息",
		5:  "内容涉及色情",
		6:  "内容涉及赌博诈骗信息",
		7:  "内容涉及人身攻击",
		8:  "内容涉及侵犯他人隐私",
		9:  "内容涉及垃圾广告",
		10: "内容涉及引战",
		11: "内容涉及视频剧透",
		12: "恶意刷屏",
		13: "视频不相关",
		14: "其他",
		15: "内容涉及违禁相关",
		16: "内容不适宜",
		17: "内容涉及青少年不良信息",
	}
	BlockReason = map[int8]string{
		4:  "发布赌博诈骗信息",
		5:  "发布违禁相关信息",
		6:  "发布垃圾广告信息",
		7:  "发布人身攻击言论",
		8:  "发布侵犯他人隐私信息",
		9:  "发布引战言论",
		10: "发布剧透信息",
		13: "发布色情信息",
		14: "发布低俗信息",
		17: "发布非法网站信息",
		18: "发布传播不实信息",
		19: "发布怂恿教唆信息",
		20: "恶意刷屏",
		24: "发布青少年不良内容",
	}
)

// ReportListParams .
type ReportListParams struct {
	States   []int64 `form:"state,split"`
	UpOps    []int64 `form:"upop,split"`
	Tids     []int64 `form:"tid,split"`
	Aid      int64   `form:"aid"`
	Cid      int64   `form:"cid"`
	UID      int64   `form:"uid"`
	RpUID    int64   `form:"rp_user"`
	RpTypes  []int64 `form:"rp_type,split"`
	Start    string  `form:"start"`
	End      string  `form:"end"`
	Sort     string  `form:"sort"`
	Order    string  `form:"order"`
	Keyword  string  `form:"keyword"`
	Page     int32   `form:"page" default:"1"`
	PageSize int32   `form:"page_size" default:"100" validate:"max=1000"`
}

// Report dm report struct.
type Report struct {
	DidStr   string        `json:"dmid_str"` // str id
	ID       int64         `json:"id"`
	Did      int64         `json:"dmid"`         // 弹幕id
	Cid      int64         `json:"cid"`          // 视频的id
	Aid      int64         `json:"arc_aid"`      // 稿件的id
	Tid      int64         `json:"arc_typeid"`   // 稿件的分区id
	UID      int64         `json:"dm_owner_uid"` // 弹幕发送者的uid
	Msg      string        `json:"dm_msg"`       // 弹幕内容
	Count    int64         `json:"count"`        // 被举报次数
	Content  string        `json:"content"`      // 举报内容:只有类别其他才有值
	UpOP     int8          `json:"up_op"`        // up主操作状态
	State    int8          `json:"state"`        // 举报状态
	RpUID    int64         `json:"uid"`          // 最后一个举报用户id
	RpTime   string        `json:"rp_time"`      // 举报时间
	RpType   int64         `json:"reason"`       // 举报类型
	Title    string        `json:"arc_title"`    // 稿件标题
	Deleted  int64         `json:"dm_deleted"`   // 弹幕状态
	UPUid    int64         `json:"arc_mid"`      // up主id
	PoolID   int64         `json:"pool_id"`      // 弹幕池
	Model    int64         `json:"model"`        // 弹幕model
	Score    int32         `json:"score"`        // 举报分
	SendTime string        `json:"dm_ctime"`     // 弹幕发送时间
	Ctime    string        `json:"ctime"`        // 插入时间
	Mtime    string        `json:"mtime"`        // 更新时间
	RptUsers []*ReportUser `json:"user"`         // 举报用户列表
}

// ReportMsg report message
type ReportMsg struct {
	Aid         int64
	Uids        string
	Did         int64
	Title       string
	Msg         string
	State       int8
	RptReason   int8
	BlockReason int8
	Block       int64
}

// ReportJudge report judge
type ReportJudge struct {
	AID        int64  `json:"aid"`
	MID        int64  `json:"mid"`
	Operator   string `json:"operator"`
	OperID     int64  `json:"oper_id"`
	OContent   string `json:"origin_content"`
	OTitle     string `json:"origin_title"`
	OType      int64  `json:"origin_type"`
	OURL       string `json:"origin_url"`
	ReasonType int64  `json:"reason_type"`
	OID        int64  `json:"oid"`
	RPID       int64  `json:"rp_id"`
	TagID      int64  `json:"tag_id"`
	Type       int64  `json:"type"`
	Page       int64  `json:"page"`
	BTime      int64  `json:"business_time"`
}

// SearchReportResult dm repost list from search
type SearchReportResult struct {
	Code  int64  `json:"code"`
	Order string `json:"order"`
	Sort  string `json:"sort"`
	Page  *struct {
		Num   int64 `json:"num"`
		Size  int64 `json:"size"`
		Total int64 `json:"total"`
	} `json:"page"`
	Result []*Report `json:"result"`
}

// UptSearchReport update search report
type UptSearchReport struct {
	DMid  int64  `json:"dmid"`
	State int8   `json:"state"`
	Ctime string `json:"ctime"`
	Mtime string `json:"mtime"`
}

// ReportList dm report list
type ReportList struct {
	Code      int64     `json:"code"`
	Order     string    `json:"order"`
	Page      int64     `json:"page"`
	PageSize  int64     `json:"pagesize"`
	PageCount int64     `json:"pagecount"`
	Total     int64     `json:"total"`
	Result    []*Report `json:"result"`
}

// ReduceMoral reduce moral
type ReduceMoral struct {
	UID        int64
	Moral      int64
	Origin     int8
	Reason     int8
	ReasonType int8
	Operator   string
	IsNotify   int8
	Remark     string
}

// BlockUser block user
type BlockUser struct {
	UID             int64
	BlockForever    int64
	BlockTimeLength int64
	BlockRemark     string
	Operator        string
	OriginType      int64
	Moral           int64
	ReasonType      int64
	OriginTitle     string
	OriginContent   string
	OriginURL       string
	IsNotify        int64
}

// ReportUser report user
type ReportUser struct {
	ID     int64     `json:"id"`
	Did    int64     `json:"dmid"`
	UID    int64     `json:"uid"`
	Reason int64     `json:"reason"`
	State  int8      `json:"state"`
	Ctime  time.Time `json:"ctime"`
	Mtime  time.Time `json:"mtime"`
}

// ReportLog dm admin log
type ReportLog struct {
	ID      int64     `json:"id"`
	Did     int64     `json:"dmid"`
	AdminID int64     `json:"admin_id"`
	Reason  int8      `json:"reason"`
	Result  int8      `json:"result"`
	Remark  string    `json:"remark"`
	Elapsed int64     `json:"elapsed"`
	Ctime   time.Time `json:"ctime"`
	Mtime   time.Time `json:"mtime"`
}

// PosterBlockMsg return report msg template by blockReason
func PosterBlockMsg(reason int8) (str string, err error) {
	var (
		tmplKey int8
	)
	switch reason {
	case 4, 5, 13, 14, 17, 18, 19, 20, 24:
		tmplKey = 1
	case 6, 9:
		tmplKey = 2
	case 7, 8, 10, 12:
		tmplKey = 3
	default:
		err = fmt.Errorf("BlockReason %d not exist", reason)
		return
	}
	str = PostTemplate[tmplKey]
	return
}

// PosterAdminRptMsg return report msg template by adminRptReason
func PosterAdminRptMsg(reason int8) (str string, err error) {
	var (
		tmplKey int8
	)
	switch reason {
	case 1, 2, 3, 4, 5, 6, 15, 17:
		tmplKey = 1
	case 7, 10:
		tmplKey = 2
	case 8, 9, 11, 12:
		tmplKey = 3
	case 13, 14, 16:
		tmplKey = 4
	default:
		err = fmt.Errorf("adminRptReason %d not exist", reason)
		return
	}
	str = PostTemplate[tmplKey]
	return
}

// RpReasonToJudgeReason 修改弹幕风纪委的理由
func RpReasonToJudgeReason(r int8) (j int8) {
	switch r {
	case ReportReasonProhibited:
		j = 5
	case ReportReasonPorn:
		j = 13
	case RptReasonFraud:
		j = 4
	case ReportReasonAttack:
		j = 7
	case ReportReasonPrivate:
		j = 8
	case ReportReasonAd:
		j = 6
	case ReportReasonWar:
		j = 9
	case ReportReasonSpoiler:
		j = 10
	case ReportReasonMeaningless:
		j = 20
	}
	return
}

// CheckStateBelong check state first or second check
func CheckStateBelong(state int8) string {
	if state == StatFirstInit || state == StatFirstDelete || state == StatFirstIgnore {
		return "弹幕举报一审"
	}
	return "弹幕举报二审"
}