package models

import (
	"fmt"
	"strings"
	"time"

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

type PermissionClassifyMapping struct {
	Id           int       `orm:"column(id);pk" description:"ID" json:"id"`
	PermissionId int       ` description:"品种ID" json:"permissionId"`
	ClassifyId   int       `description:"分类ID" json:"classifyName"`
	CreatedTime  time.Time `description:"创建时间" json:"createdTime"`
	UpdatedTime  time.Time `description:"更新时间" json:"UpdatedTime"`
}
type ChartPermission struct {
	ChartPermissionId     int       `orm:"column(chart_permission_id);pk" description:"问题ID" json:"chart_permission_id"`
	ChartPermissionName   string    `description:"名称" json:"chart_permission_name"`
	PermissionName        string    `description:"权限名" json:"permission_name"`
	Sort                  int       `description:"排序" json:"sort"`
	Enabled               int       `description:"是否可用" json:"enabled"`
	CreatedTime           time.Time `description:"创建时间" json:"created_time"`
	LastUpdatedTime       time.Time `description:"更新时间" json:"last_updated_time"`
	TeleconferenceSort    int       `description:"电话会类型排序" json:"teleconference_sort"`
	Remark                string    `description:"备注" json:"remark"`
	ClassifyName          string    `description:"分类名称" json:"classify_name"`
	ProductName           string    `description:"产品名称" json:"product_name"`
	ProductId             int       `description:"产品ID" json:"product_id"`
	ImageURL              string    `orm:"column(image_url);" description:"图片地址" json:"image_url"`
	ShowType              int       `description:"1:查研观向小程序展示" json:"show_type"`
	IsOther               int       `description:"是否是其他,用于查研观向小程序后台展示" json:"is_other"`
	IsReport              int       `description:"是否是报告,用于查研观向小程序前台报告展示" json:"is_report"`
	CygxAuth              int       `description:"是否是权限,用于查研观向小程序前台权限校验" json:"cygx_auth"`
	PermissionType        int       `description:"1主观,2客观" json:"permission_type"`
	YbImgUrl              string    `description:"研报小程序报告列表icon" json:"yb_img_url"`
	ProductPermissionName string    `description:"种类权限名称" json:"product_permission_name"`
	PriceDrivenState      int       `description:"品种价格驱动开启状态 0-关闭 1-开启" json:"price_driven_state"`
	ImageUrlM             string    `description:"图片地址(查研观向移动端)" json:"image_url_m"`
	ParentId              int       `description:"父级权限id" json:"parent_id"`
	IsPublic              int       `description:"是否是公有权限1:公有权限,0私有权限" json:"is_public"`
}

type ChartPermissionList struct {
	ChartPermissionId     int                    `orm:"column(chart_permission_id);pk" description:"问题ID" json:"chart_permission_id"`
	ChartPermissionName   string                 `description:"名称" json:"chart_permission_name"`
	PermissionName        string                 `description:"权限名" json:"permission_name"`
	Sort                  int                    `description:"排序" json:"sort"`
	Enabled               int                    `description:"是否可用" json:"enabled"`
	CreatedTime           time.Time              `description:"创建时间" json:"created_time"`
	LastUpdatedTime       time.Time              `description:"更新时间" json:"last_updated_time"`
	TeleconferenceSort    int                    `description:"电话会类型排序" json:"teleconference_sort"`
	Remark                string                 `description:"备注" json:"remark"`
	ClassifyName          string                 `description:"分类名称" json:"classify_name"`
	ProductName           string                 `description:"产品名称" json:"product_name"`
	ProductId             int                    `description:"产品ID" json:"product_id"`
	ImageURL              string                 `orm:"column(image_url);" description:"图片地址" json:"image_url"`
	ShowType              int                    `description:"1:查研观向小程序展示" json:"show_type"`
	IsOther               int                    `description:"是否是其他,用于查研观向小程序后台展示" json:"is_other"`
	IsReport              int                    `description:"是否是报告,用于查研观向小程序前台报告展示" json:"is_report"`
	CygxAuth              int                    `description:"是否是权限,用于查研观向小程序前台权限校验" json:"cygx_auth"`
	PermissionType        int                    `description:"1主观,2客观" json:"permission_type"`
	YbImgUrl              string                 `description:"研报小程序报告列表icon" json:"yb_img_url"`
	ProductPermissionName string                 `description:"种类权限名称" json:"product_permission_name"`
	PriceDrivenState      int                    `description:"品种价格驱动开启状态 0-关闭 1-开启" json:"price_driven_state"`
	ImageUrlM             string                 `description:"图片地址(查研观向移动端)" json:"image_url_m"`
	ParentId              int                    `description:"父级权限id" json:"parent_id"`
	IsPublic              int                    `description:"是否是公有权限1:公有权限,0私有权限" json:"is_public"`
	Child                 []*ChartPermissionList `description:"子权限"`
}

// ChartPermissionSearchKeyWordMapping 表示 chart_permission_search_key_word_mapping 表的结构
type ChartPermissionSearchKeyWordMapping struct {
	ChartPermissionID int `gorm:"column:chart_permission_id"` // chart_permission_id 字段
	ClassifyID        int `gorm:"column:classify_id"`         // classify_id 字段
}
type ChartPermissionView struct {
	ParentName     string `description:"父权限名称" json:"parent_name"`
	PermissionName string `description:"权限名" json:"permission_name"`
}

type ChartPermissionListTree struct {
	ChartPermissionId int                        `description:"权限ID"`
	PermissionName    string                     `description:"权限名"`
	ParentId          int                        `description:"父权限ID"`
	IsPublic          int                        `description:"是否是公有权限"`
	PublicChild       []*ChartPermissionListTree `description:"公有权限"`
	PrivateChild      []*ChartPermissionListTree `description:"私有权限"`
}

func GetChartPermissionListByIds(chartPermissionIds []int) (items []*ChartPermissionView, err error) {
	o := orm.NewOrmUsingDB("rddp")
	sql := `SELECT c.permission_name AS permission_name, lc.permission_name AS parent_name FROM chart_permission c
		LEFT JOIN chart_permission lc
		ON c.parent_id=lc.chart_permission_id 
		WHERE c.chart_permission_id in (%s)
	`
	// 构建 IN 子句的占位符
	placeholders := make([]string, len(chartPermissionIds))
	args := make([]interface{}, len(chartPermissionIds))
	for i, id := range chartPermissionIds {
		placeholders[i] = "?"
		args[i] = id
	}
	sql = fmt.Sprintf(sql, strings.Join(placeholders, ","))
	_, err = o.Raw(sql, chartPermissionIds).QueryRows(&items)
	return
}

func GetByPermissionIdsByClassifyId(classify int) (permissionIds []int, err error) {
	o := orm.NewOrm()
	sql := "select distinct permission_id from permission_classify_mapping where classify_id =?"
	_, err = o.Raw(sql, classify).QueryRows(&permissionIds)
	return
}

func GetPermissionNameById(id int) (items string, err error) {
	o := orm.NewOrm()
	sql := `SELECT name FROM permissions WHERE permission_id=?`
	err = o.Raw(sql, id).QueryRow(&items)
	return
}

func GetClassifyIdsByPermissionIds(condition string, pars []interface{}) (classifyIds []int, err error) {
	o := orm.NewOrm()
	sql := "select distinct classify_id from permission_classify_mapping where 1=1 "
	if condition != "" {
		sql += condition
	}
	_, err = o.Raw(sql, pars).QueryRows(&classifyIds)
	return
}