package admin

import (
	"ulink-admin/frame"
	"ulink-admin/modules/car/models/model"
	"ulink-admin/modules/car/models/req"
	"ulink-admin/modules/car/models/response"
	"ulink-admin/modules/car/service"
	"ulink-admin/pkg/excels"
	"ulink-admin/pkg/file"
	"ulink-admin/pkg/page"
	"ulink-admin/utils"
)

type DriverApi struct {
	DriverService *service.DriverService `inject:""`
}

// List 查询驾驶员分页数据
// @Summary 分页查询驾驶员数据接口
// @Description 分页查询驾驶员数据接口
// @Tags 驾驶员相关接口
// @Accept application/json
// @Produce application/json
// @Param Authorization header string false "Bearer 令牌"
// @Param object query req.DriverQuery false "查询参数"
// @Security ApiKeyAuth
// @Success 200 {object} resp.Response{data=page.Page{list=model.Driver},msg=string} "分页获取驾驶员列表,返回包括列表,总数,页码,每页数量"
// @Router /driver/page [get]
func (this DriverApi) Page(c *frame.Context) {
	query := &req.DriverQuery{}
	c.ValidteError(c.ShouldBind(query), query)
	list := make([]response.DriverResponse, 0)
	i := this.DriverService.Page(query, &list)
	c.Ok(page.Page{List: list, Total: i, Size: query.PageSize})
}

// List 查询驾驶员所有数据
// @Summary 查询全部数据驾驶员数据接口
// @Description 查询全部数据驾驶员数据接口
// @Tags 驾驶员相关接口
// @Accept application/json
// @Produce application/json
// @Param Authorization header string false "Bearer 令牌"
// @Param object query req.DriverQuery false "查询参数"
// @Security ApiKeyAuth
// @Success 200 {object} resp.Response{data=model.Driver,msg=string} "分页获取驾驶员列表,返回包括列表,总数,页码,每页数量"
// @Router /driver/list [get]
func (this DriverApi) List(c *frame.Context) {
	query := &req.DriverQuery{}
	list := make([]response.DriverResponse, 0)
	c.ValidteError(c.ShouldBind(query), query)
	this.DriverService.List(query, &list)
	c.Ok(list)
}

// Get 根据驾驶员Id获取详细信息
// @Summary 驾驶员详情查询接口
// @Description 驾驶员详情查询接口
// @Tags 驾驶员相关接口
// @Accept application/json
// @Produce application/json
// @Param Authorization header string false "Bearer 令牌"
// @Param id query   int true "id" id
// @Security ApiKeyAuth
// @Success 200 {object} resp.Response{data=model.Driver,msg=string} "返回驾驶员详情查询"
// @Router /driver [get]
func (this DriverApi) Get(c *frame.Context) {
	var req struct {
		Id int64 `form:"id" binding:"required"  msg:"id不存在" ` //id
	}
	c.ValidteError(c.ShouldBind(&req), &req)
	c.Ok(this.DriverService.Get(req.Id))
}

// Add 新增驾驶员
// @Summary 新增驾驶员接口
// @Description 新增驾驶员接口
// @Tags 驾驶员相关接口
// @Accept application/json
// @Produce application/json
// @Param Authorization header string false "Bearer 令牌"
// @Param  data body model.Driver true "驾驶员实体对象"
// @Success 200 {object} resp.Response{msg=string} "操作状态"
// @Router /driver/add [post]
func (this DriverApi) Add(c *frame.Context) {
	params, driver := &req.DriverAdd{}, &model.Driver{}
	c.ValidteError(c.ShouldBind(params), params)
	utils.CopyFields(driver, params)
	this.DriverService.Insert(driver)
}

// Edit 修改驾驶员数据接口
// @Summary 修改驾驶员接口
// @Description 新增驾驶员接口
// @Tags 驾驶员相关接口
// @Accept application/json
// @Produce application/json
// @Param Authorization header string false "Bearer 令牌"
// @Param  data body model.Driver true "驾驶员实体对象"
// @Success 200 {object} resp.Response{msg=string} "操作状态"
// @Router /driver/edit [put]
func (this DriverApi) Edit(c *frame.Context) {
	params, driver := &req.DriverEdit{}, &model.Driver{}
	c.ValidteError(c.ShouldBind(params), params)
	utils.CopyFields(driver, params)
	this.DriverService.Edit(driver, c.Cols())
}

// Delete 删除驾驶员数据
// @Summary 删除驾驶员接口
// @Description 删除驾驶员接口
// @Tags 驾驶员相关接口
// @Accept application/json
// @Produce application/json
// @Param Authorization header string false "Bearer 令牌"
// @Param id path   int true "id" id
// @Success 200 {object} resp.Response{msg=string} "操作状态"
// @Router /driver [delete]
func (a DriverApi) Delete(c *frame.Context) {
	var req struct {
		Ids []int64 `form:"ids" binding:"required"  msg:"ids不存在"` //ids
	}
	c.ValidteError(c.ShouldBind(&req), &req)
	a.DriverService.Delete(req.Ids)
}

// Export 导出excel
func (this DriverApi) Export(c *frame.Context) {
	query := &req.DriverQuery{}
	list := make([]model.Driver, 0)
	c.ValidteError(c.ShouldBind(query), query)
	this.DriverService.List(query, list)
	excelList := make([]interface{}, 0)
	for _, driver := range list {
		excelList = append(excelList, driver)
	}
	_, files := excels.ExportExcel(excelList, "驾驶员数据表")
	file.DownloadExcel(c, files)
}