package partner

import (
	"errors"

	"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"
	"gorm.io/gorm/clause"
)

type Configs struct {
}

func GetPartnerConfigsFromEntity(ent entity.PartnerConfigs) *forms.PartnerConfigs {
	return &forms.PartnerConfigs{
		EnableBillsView: ent.EnableCustomerBills,
	}
}

func (c *Configs) getDefaultPartnerConfigs(partnerID uint) *forms.PartnerConfigs {
	return &forms.PartnerConfigs{
		EnableBillsView: false,
	}
}

func (c *Configs) GetPartnerConfigs(partnerID uint) (*forms.PartnerConfigs, error) {
	var ent entity.PartnerConfigs
	err := entity.NewPartnerConfigsQuerySet(db.GetDB()).PartnerIDEq(partnerID).One(&ent)
	if err != nil {
		if errors.Is(err, billing_errors.ObjectNotExistsError) {
			return c.getDefaultPartnerConfigs(partnerID), nil
		}
		return nil, err
	}
	return GetPartnerConfigsFromEntity(ent), nil
}

func (c *Configs) GetCustomerPartnerConfigs(partnerID, customerID uint) (*forms.PartnerConfigs, error) {
	ret, err := c.GetPartnerConfigs(partnerID)
	if err != nil {
		return nil, err
	}
	return ret, nil
}

func (c *Configs) UpdatePartnerConfigs(partnerID uint, configs *forms.PartnerConfigs) (*forms.PartnerConfigs, error) {
	ent := entity.PartnerConfigs{
		PartnerID:           partnerID,
		EnableCustomerBills: configs.EnableBillsView,
	}
	err := ent.Create(db.GetDB().Clauses(clause.Insert{Modifier: "IGNORE"}))
	if err != nil {
		return nil, err
	}
	err = entity.NewPartnerConfigsQuerySet(db.GetDB()).PartnerIDEq(partnerID).CustomerIDEq(0).GetUpdater().SetEnableCustomerBills(configs.EnableBillsView).Update()
	if err != nil {
		return nil, err
	}
	return c.GetPartnerConfigs(partnerID)
}

func (c *Configs) UpdateCustomerPartnerConfigs(partnerID, customerID uint, configs *forms.PartnerConfigs) (*forms.PartnerConfigs, error) {
	ret, err := c.GetPartnerConfigs(partnerID)
	if err != nil {
		return nil, err
	}
	return ret, nil
}
