// Copyright (c) Shenyang Leading Edge Intelligent Technology Co., Ltd. All rights reserved.

package me

import (
	"LAPP_ACURA_MOM_BACKEND/global"
	"LAPP_ACURA_MOM_BACKEND/grmi"
	baseModel "LAPP_ACURA_MOM_BACKEND/models/base"
	model "LAPP_ACURA_MOM_BACKEND/models/me"
	"LAPP_ACURA_MOM_BACKEND/web/middleware/jwts"
	"LAPP_ACURA_MOM_BACKEND/web/supports"
	"github.com/kataras/iris/v12"
	"github.com/kataras/iris/v12/core/router"
)

/******************************************************************************
 *
 * @Function Name            : RegisterOneProduct
 *-----------------------------------------------------------------------------
 *
 * @Description              : 为一个处理单条Product的方法注册路由
 *
 * @Function Parameters      : 路由分组
 *
 * @Function Parameters      : HTTP方法
 *
 * @Function Parameters      : 路径
 *
 * @Function Parameters      : 实际处理请求的方法
 *
 * @Author                   : 代码生成器创建
 *
 * @Date                     : 2021-10-19 15:22:21
 *
 ******************************************************************************/
func RegisterOneProduct(party router.Party, httpMethod string, path string, method func(*global.User, *model.Product) error) {

	party.Handle(httpMethod, path, func(ctx iris.Context) {
		user, ok := jwts.ParseToken(ctx)
		if !ok {
			supports.Error(ctx, iris.StatusBadRequest, supports.ParseParamsFailur, nil)
			return
		}

		var err error = nil

		entity := new(model.Product)
		if ctx.GetContentLength() > 0 {
			err := ctx.ReadJSON(entity)
			if err != nil {
				supports.Error(ctx, iris.StatusBadRequest, err.Error(), nil)
				return
			}
		} else {
			entity = nil
		}

		err = method(user, entity)
		if err != nil {
			supports.Error(ctx, iris.StatusBadRequest, err.Error(), nil)
			return
		}
		supports.Ok(ctx, supports.OptionSuccess, nil)
	})
}

/******************************************************************************
 *
 * @Function Name            : RegisterIDOfProduct
 *-----------------------------------------------------------------------------
 *
 * @Description              : 为一个通过主键处理单条Product的方法注册路由
 *
 * @Function Parameters      : 路由分组
 *
 * @Function Parameters      : HTTP方法
 *
 * @Function Parameters      : 路径
 *
 * @Function Parameters      : 实际处理请求的方法
 *
 * @Author                   : 代码生成器创建
 *
 * @Date                     : 2021-10-19 15:22:21
 *
 ******************************************************************************/
func RegisterIDOfProduct(party router.Party, httpMethod string, path string, method func(*global.User, string, string, string) error) {

	party.Handle(httpMethod, path, func(ctx iris.Context) {
		user, ok := jwts.ParseToken(ctx)
		if !ok {
			supports.Error(ctx, iris.StatusBadRequest, supports.ParseParamsFailur, nil)
			return
		}

		var err error = nil
		productId := ctx.Params().GetString("productId")
		productFamilyId := ctx.Params().GetString("productFamilyId")
		projectId := ctx.Params().GetString("projectId")
		err = method(user, productId, projectId, productFamilyId)
		if err != nil {
			supports.Error(ctx, iris.StatusBadRequest, err.Error(), nil)
			return
		}
		supports.Ok(ctx, supports.OptionSuccess, nil)
	})
}

/******************************************************************************
 *
 * @Function Name            : RegisterInsertOneProduct
 *-----------------------------------------------------------------------------
 *
 * @Description              : 为一个插入单条Product的方法注册路由
 *
 * @Function Parameters      : 路由分组
 *
 * @Function Parameters      : 路径
 *
 * @Function Parameters      : 实际处理请求的方法
 *
 * @Author                   : 代码生成器创建
 *
 * @Date                     : 2021-10-19 15:22:21
 *
 ******************************************************************************/
func RegisterInsertOneProduct(party router.Party, path string, method func(*global.User, *model.Product) error) {

	RegisterOneProduct(party, "POST", path, method)
}

/******************************************************************************
 *
 * @Function Name            : RegisterDeleteOneProduct
 *-----------------------------------------------------------------------------
 *
 * @Description              : 为一个删除单条Product的方法注册路由
 *
 * @Function Parameters      : 路由分组
 *
 * @Function Parameters      : 路径
 *
 * @Function Parameters      : 实际处理请求的方法
 *
 * @Author                   : 代码生成器创建
 *
 * @Date                     : 2021-10-19 15:22:21
 *
 ******************************************************************************/
func RegisterDeleteOneProduct(party router.Party, path string, method func(*global.User, string, string, string) error) {

	RegisterIDOfProduct(party, "DELETE", path+"/{productId:string}/{projectId:string}/{productFamilyId:string}", method)
}

/******************************************************************************
 *
 * @Function Name            : RegisterCancelProduct
 *-----------------------------------------------------------------------------
 *
 * @Description              : 为一个删除单条Product的方法注册路由
 *
 * @Function Parameters      : 路由分组
 *
 * @Function Parameters      : 路径
 *
 * @Function Parameters      : 实际处理请求的方法
 *
 * @Author                   : 代码生成器创建
 *
 * @Date                     : 2021-10-19 15:22:21
 *
 ******************************************************************************/
func RegisterCancelProduct(party router.Party, path string, method func(*global.User, string, string, string) error) {
	party.Handle("DELETE", path+"/{productId:string}/{projectId:string}/{productFamilyId:string}", func(ctx iris.Context) {
		user, ok := jwts.ParseToken(ctx)
		if !ok {
			supports.Error(ctx, iris.StatusBadRequest, supports.ParseParamsFailur, nil)
			return
		}

		var err error = nil
		productId := ctx.Params().GetString("productId")
		productFamilyId := ctx.Params().GetString("productFamilyId")
		projectId := ctx.Params().GetString("projectId")
		err = method(user, productId, projectId, productFamilyId)
		if err != nil {
			supports.Error(ctx, iris.StatusBadRequest, err.Error(), nil)
			return
		}
		supports.Ok(ctx, supports.OptionSuccess, nil)
	})
}

/******************************************************************************
 *
 * @Function Name            : RegisterSelectOneProduct
 *-----------------------------------------------------------------------------
 *
 * @Description              : 为一个查找单条Product的方法注册路由
 *
 * @Function Parameters      : 路由分组
 *
 * @Function Parameters      : 路径
 *
 * @Function Parameters      : 实际处理请求的方法
 *
 * @Author                   : 代码生成器创建
 *
 * @Date                     : 2021-10-19 15:22:21
 *
 ******************************************************************************/
func RegisterSelectOneProduct(party router.Party, path string, method func(*global.User, string, string) (*model.Product, error)) {

	party.Get(path+"/{productId:string}/{projectId:string}", func(ctx iris.Context) {
		user, ok := jwts.ParseToken(ctx)
		if !ok {
			supports.Error(ctx, iris.StatusBadRequest, supports.ParseParamsFailur, nil)
			return
		}

		productId := ctx.Params().GetString("productId")
		projectId := ctx.Params().GetString("projectId")
		result, err := method(user, productId, projectId)
		if err != nil {
			supports.Error(ctx, iris.StatusBadRequest, err.Error(), nil)
			return
		}
		if result == nil {
			supports.Error(ctx, iris.StatusNotFound, supports.NotFound, nil)
			return
		}
		supports.Ok(ctx, supports.OptionSuccess, result)
	})
}

/******************************************************************************
 *
 * @Function Name            : RegisterUpdateOneProduct
 *-----------------------------------------------------------------------------
 *
 * @Description              : 为一个修改单条Product的方法注册路由
 *
 * @Function Parameters      : 路由分组
 *
 * @Function Parameters      : 路径
 *
 * @Function Parameters      : 实际处理请求的方法
 *
 * @Author                   : 代码生成器创建
 *
 * @Date                     : 2021-10-19 15:22:21
 *
 ******************************************************************************/
func RegisterUpdateOneProduct(party router.Party, path string, method func(*global.User, *model.Product) error) {

	RegisterOneProduct(party, "PUT", path, method)
}

/******************************************************************************
 *
 * @Function Name            : RegisterMultiProduct
 *-----------------------------------------------------------------------------
 *
 * @Description              : 为一个处理多条Product的方法注册路由
 *
 * @Function Parameters      : 路由分组
 *
 * @Function Parameters      : HTTP方法
 *
 * @Function Parameters      : 路径
 *
 * @Function Parameters      : 实际处理请求的方法
 *
 * @Author                   : 代码生成器创建
 *
 * @Date                     : 2021-10-19 15:22:21
 *
 ******************************************************************************/
func RegisterMultiProduct(party router.Party, httpMethod string, path string, method func(*global.User, *[]model.Product) error) {

	party.Handle(httpMethod, path, func(ctx iris.Context) {
		user, ok := jwts.ParseToken(ctx)
		if !ok {
			supports.Error(ctx, iris.StatusBadRequest, supports.ParseParamsFailur, nil)
			return
		}

		entities := make([]model.Product, 0, 10)
		err := ctx.ReadJSON(&entities)
		if err != nil {
			supports.Error(ctx, iris.StatusBadRequest, err.Error(), nil)
			return
		}

		err = method(user, &entities)
		if err != nil {
			supports.Error(ctx, iris.StatusBadRequest, err.Error(), nil)
			return
		}
		supports.Ok(ctx, supports.OptionSuccess, nil)
	})
}

/******************************************************************************
 *
 * @Function Name            : RegisterInsertProduct
 *-----------------------------------------------------------------------------
 *
 * @Description              : 为一个插入多条Product的方法注册路由
 *
 * @Function Parameters      : 路由分组
 *
 * @Function Parameters      : 路径
 *
 * @Function Parameters      : 实际处理请求的方法
 *
 * @Author                   : 代码生成器创建
 *
 * @Date                     : 2021-10-19 15:22:21
 *
 ******************************************************************************/
func RegisterInsertProduct(party router.Party, path string, method func(*global.User, *[]model.Product) error) {

	RegisterMultiProduct(party, "POST", path, method)
}

/******************************************************************************
 *
 * @Function Name            : RegisterDeleteProduct
 *-----------------------------------------------------------------------------
 *
 * @Description              : 为一个删除多条Product的方法注册路由
 *
 * @Function Parameters      : 路由分组
 *
 * @Function Parameters      : 路径
 *
 * @Function Parameters      : 实际处理请求的方法
 *
 * @Author                   : 代码生成器创建
 *
 * @Date                     : 2021-10-19 15:22:21
 *
 ******************************************************************************/
func RegisterDeleteProduct(party router.Party, path string, method func(*global.User, *[]model.Product) error) {

	RegisterMultiProduct(party, "DELETE", path, method)
}

/******************************************************************************
 *
 * @Function Name            : RegisterSelectProduct
 *-----------------------------------------------------------------------------
 *
 * @Description              : 为一个查询Product的方法注册路由
 *
 * @Function Parameters      : 路由分组
 *
 * @Function Parameters      : 路径
 *
 * @Function Parameters      : 实际处理请求的方法
 *
 * @Author                   : 代码生成器创建
 *
 * @Date                     : 2021-10-19 15:22:21
 *
 ******************************************************************************/
func RegisterSelectProduct(party router.Party, path string, method func(*global.User, map[string]string) ([]model.Product, error)) {

	party.Get(path, func(ctx iris.Context) {
		user, ok := jwts.ParseToken(ctx)
		if !ok {
			supports.Error(ctx, iris.StatusBadRequest, supports.ParseParamsFailur, nil)
			return
		}

		result, err := method(user, ctx.URLParams())
		if err != nil {
			supports.Error(ctx, iris.StatusBadRequest, err.Error(), nil)
			return
		}
		supports.Ok(ctx, supports.OptionSuccess, result)
	})
}

/******************************************************************************
 *
 * @Function Name            : RegisterQueryProduct
 *-----------------------------------------------------------------------------
 *
 * @Description              : 为一个查询Product并分页的方法注册路由
 *
 * @Function Parameters      : 路由分组
 *
 * @Function Parameters      : 路径
 *
 * @Function Parameters      : 实际处理请求的方法
 *
 * @Author                   : 代码生成器创建
 *
 * @Date                     : 2021-10-19 15:22:21
 *
 ******************************************************************************/
func RegisterQueryProduct(party router.Party, path string, method func(*global.User, map[string]string) (grmi.PagingResult, error)) {

	party.Get(path, func(ctx iris.Context) {
		user, ok := jwts.ParseToken(ctx)
		if !ok {
			supports.Error(ctx, iris.StatusBadRequest, supports.ParseParamsFailur, nil)
			return
		}

		result, err := method(user, ctx.URLParams())
		if err != nil {
			supports.Error(ctx, iris.StatusBadRequest, err.Error(), nil)
			return
		}
		supports.Ok(ctx, supports.OptionSuccess, result)
	})
}

/******************************************************************************
 *
 * @Function Name            : RegisterUpdateProduct
 *-----------------------------------------------------------------------------
 *
 * @Description              : 为一个修改多条Product的方法注册路由
 *
 * @Function Parameters      : 路由分组
 *
 * @Function Parameters      : 路径
 *
 * @Function Parameters      : 实际处理请求的方法
 *
 * @Author                   : 代码生成器创建
 *
 * @Date                     : 2021-10-19 15:22:21
 *
 ******************************************************************************/
func RegisterUpdateProduct(party router.Party, path string, method func(*global.User, *[]model.Product) error) {

	RegisterMultiProduct(party, "PUT", path, method)
}

/******************************************************************************
 *
 * @Function Name            : RegisterSelectProductByWorkLine
 *-----------------------------------------------------------------------------
 *
 * @Description              : 为一个通过产线查找Product的方法注册路由
 *
 * @Function Parameters      : 路由分组
 *
 * @Function Parameters      : 路径
 *
 * @Function Parameters      : 实际处理请求的方法
 *
 * @Author                   : zhangxin
 *
 * @Date                     : 2021-11-15
 *
 ******************************************************************************/
func RegisterSelectProductByWorkLine(party router.Party, path string, method func(*global.User, string) ([]model.Product, error)) {

	party.Get(path, func(ctx iris.Context) {
		user, ok := jwts.ParseToken(ctx)
		if !ok {
			return
		}

		workLineId := ctx.URLParam("workLineId")
		result, err := method(user, workLineId)
		if err != nil {
			supports.Error(ctx, iris.StatusBadRequest, err.Error(), nil)
			return
		}
		supports.Ok(ctx, supports.OptionSuccess, result)
	})
}

/******************************************************************************
 *
 * @Function Name            : RegisterCopyProduct
 *-----------------------------------------------------------------------------
 *
 * @Description              : 复制
 *
 * @Function Parameters      : 路由分组
 *
 * @Function Parameters      : HTTP方法
 *
 * @Function Parameters      : 路径
 *
 * @Function Parameters      : 实际处理请求的方法
 *
 * @Author                   : zhangxin
 *
 * @Date                     : 2022-01-04
 *
 ******************************************************************************/
func RegisterCopyProduct(party router.Party, path string, method func(*global.User, string, string, string) error) {

	party.Post(path, func(ctx iris.Context) {
		user, ok := jwts.ParseToken(ctx)
		if !ok {
			return
		}
		type Req struct {
			ProductId       string `json:"productId"`
			ProjectId       string `json:"projectId"`
			TargetProjectId string `json:"targetProjectId"`
		}
		var data Req
		if err := ctx.ReadJSON(&data); err != nil {
			supports.Error(ctx, iris.StatusBadRequest, err.Error(), nil)
			return
		}
		err := method(user, data.ProductId, data.ProjectId, data.TargetProjectId)
		if err != nil {
			supports.Error(ctx, iris.StatusBadRequest, err.Error(), nil)
			return
		}
		supports.Ok(ctx, supports.OptionSuccess, nil)
	})
}

/******************************************************************************
 *
 * @Function Name            : RegisterCopyProduct
 *-----------------------------------------------------------------------------
 *
 * @Description              : 复制
 *
 * @Function Parameters      : 路由分组
 *
 * @Function Parameters      : HTTP方法
 *
 * @Function Parameters      : 路径
 *
 * @Function Parameters      : 实际处理请求的方法
 *
 * @Author                   : zhangxin
 *
 * @Date                     : 2022-01-04
 *
 ******************************************************************************/
func RegisterSelectWorkLineByProduct(party router.Party, path string, method func(*global.User, string, string) ([]baseModel.WorkLine, error)) {

	party.Get(path, func(ctx iris.Context) {
		user, ok := jwts.ParseToken(ctx)
		if !ok {
			return
		}
		productId := ctx.URLParam("productId")
		projectId := ctx.URLParam("projectId")
		if productId == "" || projectId == "" {
			supports.Error(ctx, iris.StatusBadRequest, "参数错误", nil)
			return
		}
		result, err := method(user, productId, projectId)
		if err != nil {
			supports.Error(ctx, iris.StatusBadRequest, err.Error(), nil)
			return
		}
		supports.Ok(ctx, supports.OptionSuccess, result)
	})
}
