package server

import (
	"context"
	"errors"
	"fmt"

	"github.com/tidbcloud/AgentTeam/internal/api/admin"
	"github.com/tidbcloud/AgentTeam/internal/api/billing"
)

type adminHostedCreditGrantClient struct {
	next interface {
		GrantHostedCredit(context.Context, billing.HostedCreditGrantParams) (billing.HostedCreditGrant, error)
	}
}

func (client adminHostedCreditGrantClient) GrantHostedCredit(ctx context.Context, params admin.HostedCreditGrantParams) (admin.HostedCreditGrant, error) {
	if client.next == nil {
		return admin.HostedCreditGrant{}, fmt.Errorf("agentteam-maas billing client is not configured")
	}
	grant, err := client.next.GrantHostedCredit(ctx, billing.HostedCreditGrantParams{
		OrganizationID:    params.OrganizationID,
		IdempotencyKey:    params.IdempotencyKey,
		CreditUnit:        params.CreditUnit,
		CreditAmount:      params.CreditAmount,
		CreditAmountAtoms: params.CreditAmountAtoms,
		GrantSourceType:   params.GrantSourceType,
		GrantReasonRef:    params.GrantReasonRef,
		Refundable:        params.Refundable,
		ExpiresAt:         params.ExpiresAt,
		OperatorIdentity:  params.OperatorIdentity,
		SourceRef:         params.SourceRef,
	})
	if err != nil {
		var maasErr billing.MaaSClientError
		if errors.As(err, &maasErr) {
			return admin.HostedCreditGrant{}, admin.HostedCreditGrantServiceError{
				StatusCode: maasErr.StatusCode,
				Cause:      err,
			}
		}
		return admin.HostedCreditGrant{}, err
	}
	return admin.HostedCreditGrant{
		GrantID:           grant.GrantID,
		OperationID:       grant.OperationID,
		Created:           grant.Created,
		OrganizationID:    grant.OrganizationID,
		CreditUnit:        grant.CreditUnit,
		CreditAmount:      grant.CreditAmount,
		CreditAmountAtoms: grant.CreditAmountAtoms,
		GrantSourceType:   grant.GrantSourceType,
		GrantReasonRef:    grant.GrantReasonRef,
		Refundable:        grant.Refundable,
		ExpiresAt:         grant.ExpiresAt,
		OperatorIdentity:  grant.OperatorIdentity,
		SourceRef:         grant.SourceRef,
		CreatedAt:         grant.CreatedAt,
		UpdatedAt:         grant.UpdatedAt,
	}, nil
}
