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

func (model *CommodityModel) AddCommodity(commodityForm *forms.Commodity) (err error) {
	err = model.validateCommodityInput(commodityForm)
	if err != nil {
		return err
	}
	commodityEntity := &entity.Commodity{
		CommodityCode:     commodityForm.CommodityCode,
		CommodityShowName: commodityForm.CommodityShowName,
		CommodityType:     commodityForm.CommodityType,
		Owner:             commodityForm.Owner,
		ModifierAndCreator: entity.ModifierAndCreator{
			Modifier: commodityForm.ModifierAndCreator.Creator,
			Creator:  commodityForm.ModifierAndCreator.Creator,
			Describe: commodityForm.ModifierAndCreator.Describe,
		},
	}

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

func (*CommodityModel) validateCommodityInput(commodityForm *forms.Commodity) (err error) {
	var checkEntity []entity.Commodity
	err = entity.NewCommodityQuerySet(db.GetDB()).CommodityCodeEq(commodityForm.CommodityCode).All(&checkEntity)
	if err != nil {
		return err
	}
	if len(checkEntity) > 0 {

		return billing_errors.NewInvalidInputError(err)
	}
	err = entity.NewCommodityQuerySet(db.GetDB()).CommodityShowNameEq(commodityForm.CommodityShowName).All(&checkEntity)
	if err != nil {
		return err
	}
	if len(checkEntity) > 0 {

		return billing_errors.NewInvalidInputError(err)
	}
	return
}

func (model *CommodityModel) QueryCommodities(commodityQueryForm *forms.CommodityQuery) (allCommodity []forms.Commodity, err error) {
	query := entity.NewCommodityQuerySet(db.GetDB())
	var allEntity []entity.Commodity
	{
		if len(commodityQueryForm.CommodityCode) > 0 {
			query = query.CommodityCodeEq(commodityQueryForm.CommodityCode)
		}
		if len(commodityQueryForm.CommodityShowName) > 0 {
			query = query.CommodityShowNameEq(commodityQueryForm.CommodityShowName)
		}
		if len(commodityQueryForm.Owner) > 0 {
			query = query.OwnerEq(commodityQueryForm.Owner)
		}

	}
	err = query.All(&allEntity)
	if err != nil {
		return nil, err
	}
	for _, entity := range allEntity {
		allCommodity = append(allCommodity, *commodityFromEntity(&entity))
	}
	return allCommodity, nil

}

func commodityFromEntity(entityCommodity *entity.Commodity) *forms.Commodity {
	return &forms.Commodity{
		ID:                entityCommodity.ID,
		CreatedAt:         entityCommodity.CreatedAt,
		UpdatedAt:         entityCommodity.UpdatedAt,
		CommodityCode:     entityCommodity.CommodityCode,
		CommodityShowName: entityCommodity.CommodityShowName,
		CommodityType:     entityCommodity.CommodityType,
		Owner:             entityCommodity.Owner,
		ModifierAndCreator: forms.ModifierAndCreator{
			Modifier: entityCommodity.Modifier,
			Creator:  entityCommodity.Creator,
			Describe: entityCommodity.Describe,
		},
	}

}
func (model *CommodityModel) ModifyCommodity(commodityModifyForm *forms.CommodityModify) (commodity *forms.Commodity, err error) {
	var commodityEntity entity.Commodity
	err = db.GetDB().First(&commodityEntity, commodityModifyForm.ModifyID).Error
	if err != nil {
		return nil, err
	}
	if len(commodityModifyForm.Commodity.CommodityShowName) > 0 && commodityEntity.CommodityShowName != commodityModifyForm.Commodity.CommodityShowName {
		commodityEntity.CommodityShowName = commodityModifyForm.Commodity.CommodityShowName
	}
	if len(commodityModifyForm.Commodity.CommodityType) > 0 && commodityEntity.CommodityType != commodityModifyForm.Commodity.CommodityType {
		commodityEntity.CommodityType = commodityModifyForm.Commodity.CommodityType
	}
	if len(commodityModifyForm.Commodity.Owner) > 0 && commodityEntity.Owner != commodityModifyForm.Commodity.Owner {
		commodityEntity.Owner = commodityModifyForm.Commodity.Owner
	}
	commodityEntity.ModifierAndCreator.Modifier = commodityModifyForm.Commodity.ModifierAndCreator.Modifier
	commodityEntity.ModifierAndCreator.Describe = commodityModifyForm.Commodity.ModifierAndCreator.Describe

	err = commodityEntity.Update(db.GetDB(), entity.CommodityDBSchema.CommodityShowName, entity.CommodityDBSchema.CommodityType, entity.CommodityDBSchema.Owner)
	if err != nil {
		return nil, err
	}
	err = db.GetDB().First(&commodityEntity, commodityModifyForm.ModifyID).Error
	if err != nil {
		return nil, err
	}
	return commodityFromEntity(&commodityEntity), nil
}
