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 CommodityEditionModel struct {
}

func (model *CommodityEditionModel) AddCommodityEdition(editionForm *forms.CommodityEdition) (err error) {
	err = model.validateCommodityEditionInput(editionForm)
	if err != nil {
		return err
	}
	editionEntity := &entity.CommodityEdition{
		EditionCode:           editionForm.EditionCode,
		CommodityCode:         editionForm.CommodityCode,
		EditionShowName:       editionForm.EditionShowName,
		EditionDimensionValue: entity.EditionDimensionValue(editionForm.EditionDimensionValue),
		ModifierAndCreator: entity.ModifierAndCreator{
			Modifier: editionForm.ModifierAndCreator.Creator,
			Creator:  editionForm.ModifierAndCreator.Creator,
			Describe: editionForm.ModifierAndCreator.Describe,
		},
	}

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

func (*CommodityEditionModel) validateCommodityEditionInput(editionForm *forms.CommodityEdition) (err error) {
	var checkEntity []entity.CommodityEdition
	err = entity.NewCommodityEditionQuerySet(db.GetDB()).EditionCodeEq(editionForm.EditionCode).All(&checkEntity)

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

		return billing_errors.NewInvalidInputError(err)
	}
	return
}
func (model *CommodityEditionModel) QueryCommodityEditions(editionQueryForm *forms.CommodityEditionQuery) (allCommodityEdition []forms.CommodityEdition, err error) {
	var allEntity []entity.CommodityEdition
	query := entity.NewCommodityEditionQuerySet(db.GetDB())
	{
		if len(editionQueryForm.CommodityCode) > 0 {
			query = query.CommodityCodeEq(editionQueryForm.CommodityCode)
		}
		if len(editionQueryForm.EditionCode) > 0 {
			query = query.CommodityCodeEq(editionQueryForm.EditionCode)
		}
		if len(editionQueryForm.EditionShowName) > 0 {
			query = query.EditionShowNameEq(editionQueryForm.EditionShowName)
		}

	}
	err = query.All(&allEntity)
	if err != nil {
		return nil, err
	}
	for _, editionEntity := range allEntity {
		allCommodityEdition = append(allCommodityEdition, *editionFromEntity(&editionEntity))
	}
	return

}

func editionFromEntity(editionEntity *entity.CommodityEdition) *forms.CommodityEdition {
	return &forms.CommodityEdition{
		ID:                    editionEntity.ID,
		CreatedAt:             editionEntity.CreatedAt,
		UpdatedAt:             editionEntity.UpdatedAt,
		EditionCode:           editionEntity.EditionCode,
		CommodityCode:         editionEntity.CommodityCode,
		EditionShowName:       editionEntity.EditionShowName,
		EditionDimensionValue: forms.EditionDimensionValue(editionEntity.EditionDimensionValue),
		ModifierAndCreator: forms.ModifierAndCreator{
			Modifier: editionEntity.Modifier,
			Creator:  editionEntity.Creator,
			Describe: editionEntity.Describe,
		},
	}
}
func (model *CommodityEditionModel) ModifyCommodityEdition(commodityEditionModifyForm *forms.CommodityEditionModify) (commodityEditionForm *forms.CommodityEdition, err error) {
	var commodityEditionEntity entity.CommodityEdition
	err = db.GetDB().First(&commodityEditionEntity, commodityEditionModifyForm.ModifyID).Error

	if err != nil {
		return nil, err
	}
	if len(commodityEditionModifyForm.CommodityEdition.EditionShowName) > 0 && commodityEditionEntity.EditionShowName != commodityEditionModifyForm.CommodityEdition.EditionShowName {
		commodityEditionEntity.EditionShowName = commodityEditionModifyForm.CommodityEdition.EditionShowName
	}
	if len(commodityEditionModifyForm.CommodityEdition.EditionCode) > 0 && commodityEditionEntity.EditionCode != commodityEditionModifyForm.CommodityEdition.EditionCode {
		commodityEditionEntity.EditionCode = commodityEditionModifyForm.CommodityEdition.EditionCode
	}
	commodityEditionEntity.Modifier = commodityEditionModifyForm.CommodityEdition.ModifierAndCreator.Modifier
	commodityEditionEntity.Describe = commodityEditionModifyForm.CommodityEdition.ModifierAndCreator.Describe
	if len(commodityEditionModifyForm.CommodityEdition.EditionDimensionValue) > 0 {
		err = db.GetDB().Model(commodityEditionEntity).Update("edition_dimension_value", entity.EditionDimensionValue(commodityEditionModifyForm.CommodityEdition.EditionDimensionValue)).Error
		if err != nil {
			return nil, err
		}
	}

	err = commodityEditionEntity.Update(db.GetDB(), entity.CommodityEditionDBSchema.EditionShowName, entity.CommodityEditionDBSchema.EditionCode)
	if err != nil {
		return nil, err
	}
	err = db.GetDB().First(&commodityEditionEntity, commodityEditionModifyForm.ModifyID).Error
	if err != nil {
		return nil, err
	}
	return editionFromEntity(&commodityEditionEntity), nil
}
