package api

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"github.com/pingcap/dbaas/billing2/billing_errors"
	"github.com/pingcap/dbaas/billing2/forms"
	"github.com/pingcap/dbaas/billing2/model/managementcommodity"
	"github.com/pingcap/dbaas/billing2/utils/ginutils"
)

type CommodityAPI struct {
}

// @Summary Create Commodity
// @Schemes
// @Accept json
// @Produce json
// @Param CreateCommodity body forms.Commodity true "Commodity"
// @Success 200 {object} forms.Commodity
// @Router /create_commodity [post]
func (s *CommodityAPI) CreateCommodity(c *gin.Context) (ginutils.HandlerFuncResult, error) {
	commodityForm := &forms.Commodity{}
	if err := c.ShouldBindJSON(commodityForm); err != nil {
		return nil, billing_errors.NewInvalidInputError(err)
	}
	model := &managementcommodity.CommodityModel{}
	error := model.AddCommodity(commodityForm)
	if error != nil {
		return nil, billing_errors.NewInvalidInputError(error)
	}
	return &forms.OK, nil

}

// @Summary Add CommodityDimension
// @Schemes
// @Accept json
// @Produce json
// @Param AddCommodityDimension body forms.CommodityDimension true "Commodity"
// @Success 200 {object} forms.CommodityDimension
// @Router /add_commodity_dimension [post]
func (s *CommodityAPI) AddCommodityDimension(c *gin.Context) (ginutils.HandlerFuncResult, error) {
	dimensionForm := &forms.CommodityDimension{}
	if err := c.ShouldBindJSON(dimensionForm); err != nil {
		return nil, billing_errors.NewInvalidInputError(err)
	}
	model := &managementcommodity.CommodityDimensionsModel{}
	error := model.AddCommodityDimension(dimensionForm)
	if error != nil {
		return nil, billing_errors.NewInvalidInputError(error)
	}
	return &forms.OK, nil

}

// @Summary Add AddCommodityEdition
// @Schemes
// @Accept json
// @Produce json
// @Param AddCommodityEdition body forms.CommodityEdition true "Commodity"
// @Success 200 {object} forms.CommodityEdition
// @Router /add_commodity_edition [post]
func (s *CommodityAPI) AddCommodityEdition(c *gin.Context) (ginutils.HandlerFuncResult, error) {
	editionForm := &forms.CommodityEdition{}
	if err := c.ShouldBindJSON(editionForm); err != nil {
		return nil, billing_errors.NewInvalidInputError(err)
	}
	model := &managementcommodity.CommodityEditionModel{}
	error := model.AddCommodityEdition(editionForm)
	if error != nil {
		return nil, billing_errors.NewInvalidInputError(error)
	}
	return &forms.OK, nil

}

// @Summary Add AddSkuTemplate
// @Schemes
// @Accept json
// @Produce json
// @Param AddSkuTemplate body forms.SkuTemplate true "Commodity"
// @Success 200 {object} forms.SkuTemplate
// @Router /add_sku_template [post]
func (s *CommodityAPI) AddSkuTemplate(c *gin.Context) (ginutils.HandlerFuncResult, error) {
	skuTemplateForm := &forms.SkuTemplate{}
	if err := c.ShouldBindJSON(skuTemplateForm); err != nil {
		return nil, billing_errors.NewInvalidInputError(err)
	}
	model := &managementcommodity.CommoditySkuTemplateModel{}
	error := model.AddCommoditySkuTemplate(skuTemplateForm)
	if error != nil {
		return nil, billing_errors.NewInvalidInputError(error)
	}
	return &forms.OK, nil

}

// @Summary Query Commodities
// @Schemes
// @Accept json
// @Produce json
// @Param CreateCommodity body forms.CommodityQuery true "CommodityQuery"
// @Success 200 {object} []forms.Commodity
// @Router /query_commodities [post]
func (s *CommodityAPI) QueryCommodities(c *gin.Context) (ginutils.HandlerFuncResult, error) {
	commodityQueryForm := &forms.CommodityQuery{}
	if err := c.ShouldBindJSON(commodityQueryForm); err != nil {
		return nil, billing_errors.NewInvalidInputError(err)
	}
	model := &managementcommodity.CommodityModel{}
	return model.QueryCommodities(commodityQueryForm)

}

// @Summary QueryCommodityDimensions
// @Schemes
// @Accept json
// @Produce json
// @Param QueryCommodityDimensions body forms.CommodityDimensionQuery true "CommodityDimensionQuery"
// @Success 200 {object} []forms.CommodityDimension
// @Router /query_commodity_dimensions [GET]
func (s *CommodityAPI) QueryCommodityDimensions(c *gin.Context) (ginutils.HandlerFuncResult, error) {
	dimensionsForm := &forms.CommodityDimensionQuery{}
	if err := c.ShouldBindJSON(dimensionsForm); err != nil {
		return nil, billing_errors.NewInvalidInputError(err)
	}
	model := &managementcommodity.CommodityDimensionsModel{}
	return model.QueryCommodityDimensions(dimensionsForm)

}

// @Summary QueryCommodityEditions
// @Schemes
// @Accept json
// @Produce json
// @Param QueryCommodityDimensions body forms.CommodityEditionQuery true "CommodityEditionQuery"
// @Success 200 {object} []forms.CommodityEdition
// @Router /query_commodity_editions [GET]
func (s *CommodityAPI) QueryCommodityEditions(c *gin.Context) (ginutils.HandlerFuncResult, error) {
	editionQueryForm := &forms.CommodityEditionQuery{}
	if err := c.ShouldBindJSON(editionQueryForm); err != nil {
		return nil, billing_errors.NewInvalidInputError(err)
	}
	model := &managementcommodity.CommodityEditionModel{}
	return model.QueryCommodityEditions(editionQueryForm)

}

// @Summary QuerySkuTemplates
// @Schemes
// @Accept json
// @Produce json
// @Param QueryCommodityDimensions body forms.SkuTemplateQuery true "SkuTemplateQuery"
// @Success 200 {object} []forms.SkuTemplate
// @Router /query_commodity_sku_templates [GET]
func (s *CommodityAPI) QuerySkuTemplates(c *gin.Context) (ginutils.HandlerFuncResult, error) {
	skuTemplateForm := &forms.SkuTemplateQuery{}
	if err := c.ShouldBindJSON(skuTemplateForm); err != nil {
		return nil, billing_errors.NewInvalidInputError(err)
	}
	model := &managementcommodity.CommoditySkuTemplateModel{}
	return model.QueryCommoditySkuTemplate(skuTemplateForm)

}

// @Summary ModifyCommodity
// @Schemes
// @Accept json
// @Produce json
// @Param ModifyCommodity body forms.CommodityModify true "CommodityModify"
// @Success 200 {object} forms.Commodity
// @Router /modify_commodity [PUT]
func (s *CommodityAPI) ModifyCommodity(c *gin.Context) (ginutils.HandlerFuncResult, error) {
	commodityModifyForm := &forms.CommodityModify{}
	if err := c.ShouldBindJSON(commodityModifyForm); err != nil {
		return nil, billing_errors.NewInvalidInputError(err)
	}
	model := &managementcommodity.CommodityModel{}
	commodityForm, error := model.ModifyCommodity(commodityModifyForm)
	if error != nil {
		return nil, billing_errors.NewInvalidInputError(error)
	}
	return commodityForm, nil

}

// @Summary ModifyCommodityDimension
// @Schemes
// @Accept json
// @Produce json
// @Param ModifyCommodityDimension body forms.CommodityDimensionModify true "CommodityDimensionModify"
// @Success 200 {object} forms.CommodityDimension
// @Router /modify_commodity_dimension [PUT]
func (s *CommodityAPI) ModifyCommodityDimension(c *gin.Context) (ginutils.HandlerFuncResult, error) {
	form := &forms.CommodityDimensionModify{}
	if err := c.ShouldBindJSON(form); err != nil {
		return nil, billing_errors.NewInvalidInputError(err)
	}
	model := &managementcommodity.CommodityDimensionsModel{}
	commodityDimensionForm, error := model.ModifyCommodityDimension(form)
	if error != nil {
		return nil, billing_errors.NewInvalidInputError(error)
	}
	return commodityDimensionForm, nil

}

// @Summary ModifyCommodityEdition
// @Schemes
// @Accept json
// @Produce json
// @Param ModifyCommodityEdition body forms.CommodityEditionModify true "CommodityEditionModify"
// @Success 200 {object} []forms.CommodityEdition
// @Router /modify_commodity_edition [post]
func (s *CommodityAPI) ModifyCommodityEdition(c *gin.Context) (ginutils.HandlerFuncResult, error) {
	form := &forms.CommodityEditionModify{}
	if err := c.ShouldBindJSON(form); err != nil {
		return nil, billing_errors.NewInvalidInputError(err)
	}
	model := &managementcommodity.CommodityEditionModel{}
	commodityEdition, error := model.ModifyCommodityEdition(form)
	if error != nil {
		return nil, billing_errors.NewInvalidInputError(error)
	}
	return commodityEdition, nil

}

// @Summary ModifySkuTemplate
// @Schemes
// @Accept json
// @Produce json
// @Param ModifySkuTemplate body forms.SkuTemplateModify true "SkuTemplateModify"
// @Success 200 {object} forms.SkuTemplate
// @Router /modify_commodity_sku_template [post]
func (s *CommodityAPI) ModifySkuTemplate(c *gin.Context) (ginutils.HandlerFuncResult, error) {
	form := &forms.SkuTemplateModify{}
	if err := c.ShouldBindJSON(form); err != nil {
		return nil, billing_errors.NewInvalidInputError(err)
	}
	model := &managementcommodity.CommoditySkuTemplateModel{}
	skuTemplate, error := model.ModifyCommoditySkuTemplate(form)
	if error != nil {
		return nil, billing_errors.NewInvalidInputError(error)
	}
	return skuTemplate, nil

}

// @Summary AddSkuList
// @Schemes
// @Accept json
// @Produce json
// @Param AddSkuList body []forms.SkuInfo true "SkuInfo"
// @Success 200 {object} []forms.SkuTemplateModify
// @Router /add_sku_list [POST]
func (s *CommodityAPI) AddSkuList(c *gin.Context) (ginutils.HandlerFuncResult, error) {
	var formList []forms.SkuInfo
	if err := c.ShouldBindJSON(&formList); err != nil {
		return nil, billing_errors.NewInvalidInputError(err)
	}
	model := &managementcommodity.CommoditySkuTemplateModel{}
	error := model.AddSkuList(formList)
	if error != nil {
		return nil, billing_errors.NewInvalidInputError(error)
	}
	return &forms.OK, nil

}

// @Summary QuerySkuList
// @Schemes
// @Accept json
// @Produce json
// @Param QuerySkuList body forms.SkuInfoQuery true "SkuInfoQuery"
// @Success 200 {object} []forms.SkuInfo
// @Router /query_sku_list [GET]
func (s *CommodityAPI) QuerySkuList(c *gin.Context) (ginutils.HandlerFuncResult, error) {
	var form forms.SkuInfoQuery
	if err := c.ShouldBindJSON(&form); err != nil {
		return nil, billing_errors.NewInvalidInputError(err)
	}
	fmt.Println("ssaa")

	model := &managementcommodity.CommoditySkuTemplateModel{}
	return model.QuerySkuList(form)

}

// @Summary ModifySkuList
// @Schemes
// @Accept json
// @Produce json
// @Param ModifySkuList body forms.SkuModify true "SkuModify"
// @Success 200 {object} []forms.SkuInfo
// @Router /modify_sku_list [PUT]
func (s *CommodityAPI) ModifySkuList(c *gin.Context) (ginutils.HandlerFuncResult, error) {
	forms := &forms.SkuModify{}
	if err := c.ShouldBindJSON(forms); err != nil {
		return nil, billing_errors.NewInvalidInputError(err)
	}
	model := &managementcommodity.CommoditySkuTemplateModel{}
	return model.ModifyCommoditySkuInfo(*forms)
}

func InitializeCommodityRouter(router ginutils.MyRoute) {
	api := &CommodityAPI{}
	router.HandleWithError("POST", "/create_commodity", api.CreateCommodity)
	router.HandleWithError("POST", "/add_commodity_dimension", api.AddCommodityDimension)
	router.HandleWithError("POST", "/add_commodity_edition", api.AddCommodityEdition)
	router.HandleWithError("POST", "/add_sku_template", api.AddSkuTemplate)

	router.HandleWithError("GET", "/query_commodities", api.QueryCommodities)
	router.HandleWithError("GET", "/query_commodity_dimensions", api.QueryCommodityDimensions)
	router.HandleWithError("GET", "/query_commodity_editions", api.QueryCommodityEditions)
	router.HandleWithError("GET", "/query_commodity_sku_templates", api.QuerySkuTemplates)

	router.HandleWithError("PUT", "/modify_commodity", api.ModifyCommodity)
	router.HandleWithError("PUT", "/modify_commodity_dimension", api.ModifyCommodityDimension)
	router.HandleWithError("PUT", "/modify_commodity_edition", api.ModifyCommodityEdition)
	router.HandleWithError("PUT", "/modify_commodity_sku_template", api.ModifySkuTemplate)

	router.HandleWithError("POST", "/add_sku_list", api.AddSkuList)
	router.HandleWithError("GET", "/query_sku_list", api.QuerySkuList)
	router.HandleWithError("PUT", "/modify_sku_list", api.ModifySkuList)

}
