package msp

import (
	"context"

	"github.com/tidbcloud/account/internel/dao/entity"
	"gorm.io/gorm"
)

var _ MspDaoIface = (*MspDao)(nil)

type MspDaoIface interface {
	// MspConfig
	GetMspConfigByOrgID(ctx context.Context, tx *gorm.DB, orgID entity.ID) (*entity.MspConfig, error)
	CreateMspConfig(ctx context.Context, tx *gorm.DB, mspConfig *entity.MspConfig) error
	UpdateMspConfig(ctx context.Context, tx *gorm.DB, mspConfig entity.MspConfig) error
	ListMspConfigs(ctx context.Context, tx *gorm.DB, filter MspConfigFilter) ([]entity.MspConfig, error)

	// PartnerCustomer
	GetCustomerByMspID(ctx context.Context, tx *gorm.DB, mspOrgID entity.ID) ([]entity.PartnerCustomer, error)
	GetCustomerByCustomerID(ctx context.Context, tx *gorm.DB, customerOrgID entity.ID) (*entity.PartnerCustomer, error)
	GetCustomerIdsByMspID(ctx context.Context, tx *gorm.DB, orgID entity.ID) ([]uint64, error)
	ListCustomers(ctx context.Context, tx *gorm.DB, filter MspCustomerFilter) ([]entity.PartnerCustomer, error)
	CreateMspCustomer(ctx context.Context, tx *gorm.DB, MspCustomer *entity.PartnerCustomer) error
	UpdateMspCustomer(ctx context.Context, tx *gorm.DB, MspCustomer entity.PartnerCustomer) error
	DeleteCustomer(ctx context.Context, tx *gorm.DB, mspCustomer entity.PartnerCustomer) error

	//MspUserServicesAgreement
	CreateMspUserServicesAgreement(ctx context.Context, tx *gorm.DB, mspUserServicesAgreement *entity.MspUserServicesAgreement) error
	BatchCreateMspUserServicesAgreements(ctx context.Context, tx *gorm.DB, mspUserServicesAgreements []entity.MspUserServicesAgreement) error
	ListMspUserServicesAgreements(ctx context.Context, tx *gorm.DB, filter UserServicesAgreementFilter) ([]entity.MspUserServicesAgreement, error)
	UpdateMspUserServicesAgreementByIds(ctx context.Context, tx *gorm.DB, ids []uint64, updater entity.MspUserServicesAgreement) error
	UpdateMspUserServicesAgreementByParam(ctx context.Context, tx *gorm.DB, param UserServicesAgreementFilter, updater entity.MspUserServicesAgreement) error
}

type MspDao struct{}

func NewMspDao() MspDaoIface {
	return &MspDao{}
}
