package managementcommodity

import (
	"github.com/pingcap/dbaas/billing2/billing_errors"
	"github.com/pingcap/dbaas/billing2/db"
	"github.com/pingcap/dbaas/billing2/db/entity"
	"github.com/pingcap/dbaas/billing2/forms"
)

type CommodityDimensionsModel struct {
}

func (model *CommodityDimensionsModel) AddCommodityDimension(dimensionForm *forms.CommodityDimension) (err error) {
	err = model.validateCommodityDimensionInput(dimensionForm)
	if err != nil {
		return err
	}
	dimensionEntity := &entity.CommodityDimension{
		DimensionCode:     dimensionForm.DimensionCode,
		CommodityCode:     dimensionForm.CommodityCode,
		DimensionShowName: dimensionForm.DimensionShowName,
		DimensionValue:    entity.DimensionValue(dimensionForm.DimensionValue),
		IsShare:           dimensionForm.IsShare,
		IsCharge:          dimensionForm.IsCharge,
		ModifierAndCreator: entity.ModifierAndCreator{
			Modifier: dimensionForm.ModifierAndCreator.Creator,
			Creator:  dimensionForm.ModifierAndCreator.Creator,
			Describe: dimensionForm.ModifierAndCreator.Describe,
		},
	}

	return dimensionEntity.Create(db.GetDB())
}

func (*CommodityDimensionsModel) validateCommodityDimensionInput(dimensionForm *forms.CommodityDimension) (err error) {
	var checkEntity []entity.CommodityDimension
	err = entity.NewCommodityDimensionQuerySet(db.GetDB()).DimensionCodeEq(dimensionForm.DimensionCode).All(&checkEntity)

	if err != nil {
		return err
	}
	if len(checkEntity) > 0 {

		return billing_errors.NewInvalidInputError(err)
	}
	return

}

func (model *CommodityDimensionsModel) QueryCommodityDimensions(dimensionQueryForm *forms.CommodityDimensionQuery) (allCommodityDimension []forms.CommodityDimension, err error) {

	query := entity.NewCommodityDimensionQuerySet(db.GetDB())
	var allEntity, shareEntitySlice []entity.CommodityDimension

	{
		if len(dimensionQueryForm.CommodityCode) > 0 {
			query = query.CommodityCodeEq(dimensionQueryForm.CommodityCode)
		}

		if len(dimensionQueryForm.DimensionCode) > 0 {
			query = query.DimensionCodeEq(dimensionQueryForm.DimensionCode)

		}
		if len(dimensionQueryForm.DimensionShowName) > 0 {
			query = query.DimensionShowNameEq(dimensionQueryForm.DimensionShowName)

		}

	}

	err = query.All(&allEntity)
	if err != nil {
		return nil, err
	}

	err = entity.NewCommodityDimensionQuerySet(db.GetDB()).IsShareEq(true).All(&shareEntitySlice)
	if err != nil {
		return nil, err
	}
	allEntity = append(allEntity, shareEntitySlice...)
	for _, entityDimension := range allEntity {
		allCommodityDimension = append(allCommodityDimension, *dimensionFromEntity(&entityDimension))
	}
	return

}

func dimensionFromEntity(entityDimension *entity.CommodityDimension) *forms.CommodityDimension {
	return &forms.CommodityDimension{
		ID:                entityDimension.ID,
		CreatedAt:         entityDimension.CreatedAt,
		UpdatedAt:         entityDimension.UpdatedAt,
		CommodityCode:     entityDimension.CommodityCode,
		DimensionCode:     entityDimension.DimensionCode,
		DimensionShowName: entityDimension.DimensionShowName,
		DimensionValue:    forms.DimensionValue(entityDimension.DimensionValue),
		IsShare:           entityDimension.IsShare,
		IsCharge:          entityDimension.IsCharge,
		ModifierAndCreator: forms.ModifierAndCreator{
			Modifier: entityDimension.Modifier,
			Creator:  entityDimension.Creator,
			Describe: entityDimension.Describe,
		},
	}

}
func (model *CommodityDimensionsModel) ModifyCommodityDimension(commodityDimensionModifyForm *forms.CommodityDimensionModify) (commodityDimensionForm *forms.CommodityDimension, err error) {
	var commodityDimensionEntity entity.CommodityDimension
	err = db.GetDB().First(&commodityDimensionEntity, commodityDimensionModifyForm.ModifyID).Error
	if err != nil {
		return nil, err
	}
	if len(commodityDimensionModifyForm.CommodityDimension.DimensionShowName) > 0 && commodityDimensionEntity.DimensionShowName != commodityDimensionModifyForm.CommodityDimension.DimensionShowName {
		commodityDimensionEntity.DimensionShowName = commodityDimensionModifyForm.CommodityDimension.DimensionShowName
	}
	if len(commodityDimensionModifyForm.CommodityDimension.DimensionCode) > 0 && commodityDimensionEntity.DimensionCode != commodityDimensionModifyForm.CommodityDimension.DimensionCode {
		commodityDimensionEntity.DimensionCode = commodityDimensionModifyForm.CommodityDimension.DimensionCode
	}

	commodityDimensionEntity.ModifierAndCreator.Modifier = commodityDimensionModifyForm.CommodityDimension.ModifierAndCreator.Modifier
	commodityDimensionEntity.ModifierAndCreator.Describe = commodityDimensionModifyForm.CommodityDimension.ModifierAndCreator.Describe
	if len(commodityDimensionModifyForm.CommodityDimension.DimensionValue) > 0 {
		err = db.GetDB().Model(commodityDimensionEntity).Update("dimension_value", entity.DimensionValue(commodityDimensionModifyForm.CommodityDimension.DimensionValue)).Error
		if err != nil {
			return nil, err
		}
	}

	err = commodityDimensionEntity.Update(db.GetDB(), entity.CommodityDimensionDBSchema.DimensionShowName, entity.CommodityDimensionDBSchema.DimensionCode)
	if err != nil {
		return nil, err
	}
	err = db.GetDB().First(&commodityDimensionEntity, commodityDimensionModifyForm.ModifyID).Error
	if err != nil {
		return nil, err
	}
	return dimensionFromEntity(&commodityDimensionEntity), nil
}
