package controllers

import (
	"cc-officialweb/models"
	"cc-officialweb/service"
	"cc-officialweb/unity"
	"cc-officialweb/utils"
	"encoding/json"
	beego "github.com/beego/beego/v2/server/web"
	"github.com/go-playground/validator/v10"
	"strconv"
)

type ProductController struct {
	beego.Controller
}

// Get 产品详情页
func (s *ProductController) Get() {
	var success []string
	ptype := s.GetString("ptype")
	product := service.GetProduct(ptype)
	//获取成功案例轮播图
	exams := service.GetResource("example")
	for _, v := range exams {
		success = append(success, v.Url)
	}
	//数据大屏展示
	data, err := service.GetData(false)
	if err == nil {
		s.Data["Datas"] = data
	} else {
		s.Data["Datas"] = "未获得数据"
	}
	productType := service.GetProductType()
	if len(productType) == 0 {
		s.Data["productFirst"] = "暂无产品分类"
	} else {
		s.Data["productFirst"] = productType[0].Name
	}
	s.Data["productType"] = productType
	s.Data["Products"] = product
	s.Data["example"] = success
	s.TplName = "product.html"
}

// AddProduct 添加产品
func (s *ProductController) AddProduct() {
	var product models.ProductDto
	err := json.Unmarshal(s.Ctx.Input.RequestBody, &product)
	if err != nil {
		s.Data["json"] = &JSON{Code: 101, Msg: "json解析失败"}
		s.ServeJSON()
		return
	}
	if service.AddProduct(product) {
		s.Data["json"] = &JSON{Code: 200, Msg: "添加成功"}
		s.ServeJSON()
	} else {
		s.Data["json"] = &JSON{Code: 102, Msg: "添加失败"}
		s.ServeJSON()
		return
	}

}

// AddProductType 添加产品分类
func (s *ProductController) AddProductType() {
	var productType models.ProductType
	err := json.Unmarshal(s.Ctx.Input.RequestBody, &productType)
	if err != nil {
		s.Data["json"] = &JSON{Code: 101, Msg: "json解析失败"}
		s.ServeJSON()
		return
	}
	if service.AddProductType(productType) {
		s.Data["json"] = &JSON{Code: 200, Msg: "添加成功"}
		s.ServeJSON()
	} else {
		s.Data["json"] = &JSON{Code: 102, Msg: "添加失败"}
		s.ServeJSON()
		return
	}
}

// GetProductType 获取产品类型
func (s *ProductController) GetProductType() {
	productType := service.GetProductType()
	s.Data["json"] = &JSON{Code: 200, Msg: "获取成功", Data: productType}
	s.ServeJSON()
}

// DeleteProductTypeById 根据id删除产品类型
func (s *ProductController) DeleteProductTypeById() {
	id := s.GetString("id")
	atoi, _ := strconv.Atoi(id)
	validate := validator.New()
	err2 := validate.Var(atoi, "required")
	if err2 != nil {
		s.Data["json"] = &JSON{Code: 103, Msg: "id不能为空"}
		s.ServeJSON()
		return
	}
	_, err := unity.DeleteById(atoi, models.ProductType{})
	if err != nil {
		s.Data["json"] = map[string]interface{}{"code": 101, "msg": "删除失败"}
		s.ServeJSON()
		return
	} else {
		s.Data["json"] = map[string]interface{}{"code": 200, "msg": "删除成功"}
		s.ServeJSON()
	}
}

// GetAllProductType 分页获取产品类型
func (s *ProductController) GetAllProductType() {
	var page unity.PageParams
	err := json.Unmarshal(s.Ctx.Input.RequestBody, &page)
	if err != nil {
		s.Data["json"] = &JSON{Code: 101, Msg: "参数错误"}
		s.ServeJSON()
		return
	}
	result, total, current, err := unity.Paginate(page, models.ProductType{})
	if err != nil {
		s.Data["json"] = &JSON{Code: 101, Msg: "查询失败"}
		s.ServeJSON()
		return
	} else {
		s.Data["json"] = &JSON{Code: 200, Msg: "查询成功", Data: &JSONS{
			Current: current,
			Size:    total,
			Data:    result,
		}}
		s.ServeJSON()
		return
	}
}

// UpdateProductType 根据id修改产品类型
func (s *ProductController) UpdateProductType() {
	var productType models.ProductType
	err := json.Unmarshal(s.Ctx.Input.RequestBody, &productType)
	if err != nil {
		s.Data["json"] = &JSON{Code: 101, Msg: "json解析失败"}
		s.ServeJSON()
		return
	}
	_, err = unity.UpdateById(productType.ID, productType)
	if err != nil {
		s.Data["json"] = &JSON{Code: 101, Msg: "修改失败"}
		s.ServeJSON()
		return
	} else {
		s.Data["json"] = &JSON{Code: 200, Msg: "修改成功"}
		s.ServeJSON()
		return
	}
}

// DeleteProductById 根据id删除产品
func (s *ProductController) DeleteProductById() {
	id := s.GetString("id")
	atoi, _ := strconv.Atoi(id)
	validate := validator.New()
	err2 := validate.Var(atoi, "required")
	if err2 != nil {
		s.Data["json"] = &JSON{Code: 103, Msg: "id不能为空"}
		s.ServeJSON()
		return
	}
	_, err := unity.DeleteById(atoi, models.Products{})
	if err != nil {
		s.Data["json"] = map[string]interface{}{"code": 101, "msg": "删除失败"}
		s.ServeJSON()
		return
	} else {
		s.Data["json"] = map[string]interface{}{"code": 200, "msg": "删除成功"}
		s.ServeJSON()
	}
}

// GetAllProduct 获取所有产品信息
func (s *ProductController) GetAllProduct() {
	var page unity.PageParams
	err := json.Unmarshal(s.Ctx.Input.RequestBody, &page)
	if err != nil {
		s.Data["json"] = &JSON{Code: 101, Msg: "参数错误"}
		s.ServeJSON()
		return
	}
	result, total, current, err := unity.Paginate(page, models.Products{})
	if err != nil {
		s.Data["json"] = &JSON{Code: 101, Msg: "查询失败"}
		s.ServeJSON()
		return
	} else {
		s.Data["json"] = &JSON{Code: 200, Msg: "查询成功", Data: &JSONS{
			Current: current,
			Size:    total,
			Data:    result,
		}}
		s.ServeJSON()
		return
	}
}

// UpdateProductById 根据id进行修改产品
func (s *ProductController) UpdateProductById() {
	var productDto models.ProductDto
	var product models.Products
	err := json.Unmarshal(s.Ctx.Input.RequestBody, &productDto)
	if err != nil {
		s.Data["json"] = &JSON{Code: 101, Msg: "json解析失败"}
		s.ServeJSON()
		return
	}
	product.Title = &productDto.Title                             //标题
	product.Synopsis = &productDto.Synopsis                       //简介
	product.Detail = &productDto.Detail                           //详情
	product.Type = &productDto.Type                               //类型 1.产品 2.服务
	product.Ptype = &productDto.Ptype                             //产品类型	软件 硬件
	product.IsIndex = &productDto.IsIndex                         //是否首页显示
	product.Url = &productDto.Url                                 //图片链接
	product.ProductIntroduction = &productDto.ProductIntroduction //产品介绍
	product.TechnicalParameters = &productDto.TechnicalParameters //技术参数
	product.Instructions = &productDto.Instructions               //使用说明
	product.SupportingSoftware = &productDto.SupportingSoftware   //配套软件
	product.OptionalAccessories = &productDto.OptionalAccessories //可选配件
	product.IsActive = &productDto.IsActive
	_, err = unity.UpdateById(productDto.ID, product)
	if err != nil {
		s.Data["json"] = &JSON{Code: 102, Msg: err.Error()}
		s.ServeJSON()
		return
	} else {
		s.Data["json"] = &JSON{Code: 200, Msg: "修改成功"}
		s.ServeJSON()
	}
}

// UpdateIsIndex 根据id修改状态
func (s *ProductController) UpdateIsIndex() {
	var productDto models.ProductDto
	var product models.Products
	err := json.Unmarshal(s.Ctx.Input.RequestBody, &productDto)
	if err != nil {
		s.Data["json"] = &JSON{Code: 101, Msg: "json解析失败"}
		s.ServeJSON()
		return
	}
	tx := utils.DB.Model(&product).Where("id = ?", productDto.ID).Update("is_index", productDto.IsIndex)
	if tx.RowsAffected > 0 {
		s.Data["json"] = &JSON{Code: 200, Msg: "修改成功"}
		s.ServeJSON()
		return
	} else {
		s.Data["json"] = &JSON{Code: 102, Msg: "修改失败"}
		s.ServeJSON()
	}
}

// UpdateIsSort 根据id修改排序
func (s *ProductController) UpdateIsSort() {
	var productDto models.ProductDto
	var product models.Products
	err := json.Unmarshal(s.Ctx.Input.RequestBody, &productDto)
	if err != nil {
		s.Data["json"] = &JSON{Code: 101, Msg: "json解析失败"}
		s.ServeJSON()
		return
	}
	tx := utils.DB.Model(&product).Where("id = ?", productDto.ID).Update("sort", productDto.Sort)
	if tx.RowsAffected > 0 {
		s.Data["json"] = &JSON{Code: 200, Msg: "修改成功"}
		s.ServeJSON()
		return
	} else {
		s.Data["json"] = &JSON{Code: 102, Msg: "修改失败"}
		s.ServeJSON()
	}
}

// GetProduct 根据id获取产品信息
func (s *ProductController) GetProduct() {
	getString := s.GetString("id")
	id, _ := strconv.Atoi(getString)
	validate := validator.New()
	err2 := validate.Var(id, "required")
	if err2 != nil {
		s.Data["json"] = &JSON{Code: 103, Msg: "id不能为空"}
		s.ServeJSON()
		return
	}
	result, err := unity.GetById(id, &models.Products{})
	if err != nil {
		s.Data["json"] = &JSON{Code: 101, Msg: "获取失败"}
		s.ServeJSON()
		return
	} else {
		s.Data["json"] = &JSON{Code: 200, Msg: "获取成功", Data: result}
		s.ServeJSON()
		return
	}
}
