package fake

import (
	"context"

	"github.com/tidbcloud/observability/pkg/resourceworker/providers/gcp/giam"
	"google.golang.org/api/googleapi"
	"google.golang.org/api/iam/v1"
)

type FakeGiamClient struct {
	Createfunc func(name string, createserviceaccountrequest *iam.CreateServiceAccountRequest) (*iam.ServiceAccount, error)
	Deletefunc func(name string) (*iam.Empty, error)
	Getfunc    func(name string) (*iam.ServiceAccount, error)
	Getiamfunc func(resource string) (*iam.Policy, error)
	Setiamfunc func(resource string, setiampolicyrequest *iam.SetIamPolicyRequest) (*iam.Policy, error)
}

type FakeCall[T interface{}] struct {
	saved T
	err   error
}

func (fc *FakeCall[T]) Do(opts ...googleapi.CallOption) (T, error) {
	return fc.saved, fc.err
}

func (f *FakeGiamClient) Create(ctx context.Context, name string, createserviceaccountrequest *iam.CreateServiceAccountRequest) giam.Callable[*iam.ServiceAccount] {
	s, e := f.Createfunc(name, createserviceaccountrequest)
	return &FakeCall[*iam.ServiceAccount]{
		saved: s,
		err:   e,
	}
}
func (f *FakeGiamClient) Delete(ctx context.Context, name string) giam.Callable[*iam.Empty] {
	s, e := f.Deletefunc(name)
	return &FakeCall[*iam.Empty]{
		saved: s,
		err:   e,
	}
}
func (f *FakeGiamClient) Get(ctx context.Context, name string) giam.Callable[*iam.ServiceAccount] {
	s, e := f.Getfunc(name)
	return &FakeCall[*iam.ServiceAccount]{
		saved: s,
		err:   e,
	}
}
func (f *FakeGiamClient) GetIamPolicy(ctx context.Context, resource string) giam.Callable[*iam.Policy] {
	s, e := f.Getiamfunc(resource)
	return &FakeCall[*iam.Policy]{
		saved: s,
		err:   e,
	}
}
func (f *FakeGiamClient) SetIamPolicy(ctx context.Context, resource string, setiampolicyrequest *iam.SetIamPolicyRequest) giam.Callable[*iam.Policy] {
	s, e := f.Setiamfunc(resource, setiampolicyrequest)
	return &FakeCall[*iam.Policy]{
		saved: s,
		err:   e,
	}
}

var _ giam.Iamclient = &FakeGiamClient{}
