package orgconfig

import (
	"context"

	tidbmgmtservicev1 "github.com/tidbcloud/tidb-management-service/api/spec/tidb_mgmt_service/v1"
	"github.com/tidbcloud/tidb-management-service/tidb-mgmt-service/domain/entity"
	"github.com/tidbcloud/tidb-management-service/tidb-mgmt-service/domain/repository"
	"github.com/tidbcloud/tidb-management-service/utilities/bizerr"
)

func NewServer(
	orgRuConfigRepo repository.OrganizationRuConfigRepository,
) tidbmgmtservicev1.OrganizationConfigServiceServer {
	return &serverImpl{
		orgRuConfigRepo: orgRuConfigRepo,
	}
}

type serverImpl struct {
	orgRuConfigRepo repository.OrganizationRuConfigRepository
}

func (s *serverImpl) UpdateOrganizationDefaultRuVersion(
	ctx context.Context,
	req *tidbmgmtservicev1.UpdateOrganizationDefaultRuVersionRequest,
) (*tidbmgmtservicev1.OrganizationRuConfig, error) {
	if req.OrganizationId == 0 {
		return nil, bizerr.New(bizerr.ErrCodeParams, "organization_id is required")
	}
	if req.DefaultRuVersion <= 0 {
		return nil, bizerr.New(bizerr.ErrCodeParams, "default_ru_version must be a positive integer")
	}

	config := &entity.OrganizationRuConfig{
		OrganizationID:   req.OrganizationId,
		DefaultRuVersion: req.DefaultRuVersion,
	}

	if err := s.orgRuConfigRepo.Upsert(ctx, config); err != nil {
		return nil, err
	}

	return &tidbmgmtservicev1.OrganizationRuConfig{
		OrganizationId:   req.OrganizationId,
		DefaultRuVersion: req.DefaultRuVersion,
	}, nil
}

func (s *serverImpl) GetOrganizationDefaultRuVersion(
	ctx context.Context,
	req *tidbmgmtservicev1.GetOrganizationDefaultRuVersionRequest,
) (*tidbmgmtservicev1.OrganizationRuConfig, error) {
	if req.OrganizationId == 0 {
		return nil, bizerr.New(bizerr.ErrCodeParams, "organization_id is required")
	}

	config, err := s.orgRuConfigRepo.GetByOrganizationId(ctx, req.OrganizationId)
	if err != nil {
		return nil, err
	}

	// If no config exists for this organization, return the system default
	if config == nil {
		return &tidbmgmtservicev1.OrganizationRuConfig{
			OrganizationId:   req.OrganizationId,
			DefaultRuVersion: repository.SystemDefaultRuVersion,
		}, nil
	}

	return &tidbmgmtservicev1.OrganizationRuConfig{
		OrganizationId:   config.OrganizationID,
		DefaultRuVersion: config.DefaultRuVersion,
	}, nil
}
