package controllers

import (
	"github.com/gogf/gf/v2/net/ghttp"
	"yx-dataset-server/app/bll"
	"yx-dataset-server/app/errors"
	"yx-dataset-server/app/schema"
	"yx-dataset-server/library/gplus"
)

type Dataset struct {
	DatasetBll bll.IDataset
}

func NewDataset(bDataset bll.IDataset) *Dataset {
	return &Dataset{
		DatasetBll: bDataset,
	}
}

// Query 查询数据
func (a *Dataset) Query(r *ghttp.Request) {
	switch r.Get("q").String() {
	case "page":
		a.QueryPage(r)
	case "list":
		a.QueryList(r)
	default:
		gplus.ResError(r, errors.ErrUnknownQuery)
	}
}

// QueryPage 查询分页数据
// @Tags
// @Summary 查询分页数据
// @Param Authorization header string false "Bearer 用户令牌"
// @Param current query int true "分页索引" 1
// @Param pageSize query int true "分页大小" 10
// @Success 200 []schema.Dataset "查询结果：{list:列表数据,pagination:{current:页索引,pageSize:页大小,total:总数量}}"
// @Failure 400 schema.HTTPError "{error:{code:0,message:未知的查询类型}}"
// @Failure 401 schema.HTTPError "{error:{code:0,message:未授权}}"
// @Failure 500 schema.HTTPError "{error:{code:0,message:服务器错误}}"
// @Router GET /web/v1/datasets?q=page
func (a *Dataset) QueryPage(r *ghttp.Request) {
	ctx := gplus.NewContext(r)
	var params schema.DatasetQueryParam
	params.OrgId = r.Get("org_id").String()
	params.LikeName = r.Get("like_name").String()
	result, err := a.DatasetBll.Query(ctx, params, schema.DatasetQueryOptions{
		PageParam: &schema.PaginationParam{
			PageIndex: gplus.GetPageIndex(r),
			PageSize:  gplus.GetPageSize(r),
		},
	})
	if err != nil {
		ResError(r, err)
	}
	ResPage(r, result.Data, result.PageResult)
}

// QueryList 查询列表数据
// @Tags
// @Summary 查询列表数据
// @Param Authorization header string false "Bearer 用户令牌"
// @Success 200 []schema.Dataset "查询结果：{list:列表数据}"
// @Failure 400 schema.HTTPError "{error:{code:0,message:未知的查询类型}}"
// @Failure 401 schema.HTTPError "{error:{code:0,message:未授权}}"
// @Failure 500 schema.HTTPError "{error:{code:0,message:服务器错误}}"
// @Router GET /web/v1/dataset?q=list
func (a *Dataset) QueryList(r *ghttp.Request) {
	ctx := gplus.NewContext(r)
	var params schema.DatasetQueryParam
	params.OrgId = r.Get("org_id").String()
	params.LikeName = r.Get("like_name").String()
	result, err := a.DatasetBll.Query(ctx, params)
	if err != nil {
		gplus.ResError(r, err)
	}
	ResSuccess(r, result.Data)
}

// Get 获取数据
// @Summary 获取数据
// @Param id path string true "记录ID"
// @Success 200  schema.Dataset
// @Failure 400  schema.HTTPError "{error:{code:0,message:无效的请求参数}}"
// @Failure 401  schema.HTTPError "{error:{code:0,message:未授权}}"
// @Failure 500  schema.HTTPError "{error:{code:0,message:服务器错误}}"
// @Router  /web/v1/dataset/{id}
func (a *Dataset) Get(r *ghttp.Request) {
	ctx := gplus.NewContext(r)
	result, err := a.DatasetBll.Get(ctx, r.Get("id").String())
	if err != nil {
		gplus.ResError(r, err)
	}
	ResSuccess(r, result)
}

// Create 创建数据
// @Tags API-Datasets
// @Summary 创建数据
// @Param body schema.Dataset true "提交的数据"
// @Success 200  schema.Dataset
// @Failure 400  schema.HTTPError "{error:{code:0,message:无效的请求参数}}"
// @Failure 401  schema.HTTPError "{error:{code:0,message:未授权}}"
// @Failure 500  schema.HTTPError "{error:{code:0,message:服务器错误}}"
// @Router /web/v1/dataset/ [post]
func (a *Dataset) Create(r *ghttp.Request) {
	var data schema.Dataset
	if err := gplus.ParseJson(r, &data); err != nil {
		gplus.ResError(r, err)
	}

	ctx := gplus.NewContext(r)
	err := a.DatasetBll.Create(ctx, data)
	if err != nil {
		gplus.ResError(r, err)
	}
	ResSuccess(r, nil)
}

// Update 更新数据
// @Summary 更新数据
// @Param body schema.Dataset true "更新数据"
// @Success 200  schema.Dataset
// @Failure 400  schema.HTTPError "{error:{code:0,message:无效的请求参数}}"
// @Failure 401  schema.HTTPError "{error:{code:0,message:未授权}}"
// @Failure 500  schema.HTTPError "{error:{code:0,message:服务器错误}}"
// @Router  /web/v1/datasets/{id}
func (a *Dataset) Update(r *ghttp.Request) {
	var data schema.Dataset
	if err := gplus.ParseJson(r, &data); err != nil {
		gplus.ResError(r, err)
	}
	ctx := gplus.NewContext(r)
	err := a.DatasetBll.Update(ctx, r.Get("id").String(), data)
	if err != nil {
		gplus.ResError(r, err)
	}
	ResSuccess(r, nil)
}

// Delete 删除数据
// @Summary 删除数据
// @Param id path string true "记录ID"
// @Success 200  schema.HTTPStatus "{status:OK}"
// @Failure 400  schema.HTTPError "{error:{code:0,message:无效的请求参数}}"
// @Failure 401  schema.HTTPError "{error:{code:0,message:未授权}}"
// @Failure 500  schema.HTTPError "{error:{code:0,message:服务器错误}}"
// @Router  /web/v1/datasets/{id}
func (a *Dataset) Delete(r *ghttp.Request) {
	ctx := gplus.NewContext(r)
	err := a.DatasetBll.Delete(ctx, r.Get("id").String())
	if err != nil {
		gplus.ResError(r, err)
	}
	ResSuccess(r, nil)
}

// QueryList 查询列表数据
// @Tags
// @Summary 查询列表数据
// @Param Authorization header string false "Bearer 用户令牌"
// @Success 200 []schema.Dataset "查询结果：{list:列表数据}"
// @Failure 400 schema.HTTPError "{error:{code:0,message:未知的查询类型}}"
// @Failure 401 schema.HTTPError "{error:{code:0,message:未授权}}"
// @Failure 500 schema.HTTPError "{error:{code:0,message:服务器错误}}"
// @Router GET /web/v1/datasets/permission
func (a *Dataset) GetPermissionDatasets(r *ghttp.Request) {
	ctx := gplus.NewContext(r)
	result, err := a.DatasetBll.GetPermissionDatasets(ctx, r.Get("org_id").String())
	if err != nil {
		gplus.ResError(r, err)
	}
	ResList(r, result)
}

// GetAvailableDatasets 按类型查询可用知识库
// @Tags
// @Summary 按类型查询可用知识库（新建企业/添加企业管理员/添加企业员工场景）
// @Param Authorization header string false "Bearer 用户令牌"
// @Param org_id query string false "组织id（为空时仅返回公共/共享知识库）"
// @Success 200  schema.AvailableDatasets "{shared_datasets:[], org_datasets:[]}"
// @Failure 401 schema.HTTPError "{error:{code:0,message:未授权}}"
// @Failure 500 schema.HTTPError "{error:{code:0,message:服务器错误}}"
// @Router GET /web/v1/datasets/available
func (a *Dataset) GetAvailableDatasets(r *ghttp.Request) {
	ctx := gplus.NewContext(r)
	result, err := a.DatasetBll.GetAvailableDatasets(ctx, r.Get("org_id").String())
	if err != nil {
		gplus.ResError(r, err)
		return
	}
	ResSuccess(r, result)
}
