package giam

import (
	"context"

	"google.golang.org/api/googleapi"
	"google.golang.org/api/iam/v1"
)

type Iamclient interface {
	Create(ctx context.Context, name string, createserviceaccountrequest *iam.CreateServiceAccountRequest) Callable[*iam.ServiceAccount]
	Delete(ctx context.Context, name string) Callable[*iam.Empty]
	Get(ctx context.Context, name string) Callable[*iam.ServiceAccount]
	GetIamPolicy(ctx context.Context, resource string) Callable[*iam.Policy]
	SetIamPolicy(ctx context.Context, resource string, setiampolicyrequest *iam.SetIamPolicyRequest) Callable[*iam.Policy]
}

type Callable[T interface {
	*iam.Empty | *iam.Policy | *iam.ServiceAccount
}] interface {
	Do(opts ...googleapi.CallOption) (T, error)
}

type ProjectsServiceAccountsServiceWrap struct {
	*iam.ProjectsServiceAccountsService
}

func (p *ProjectsServiceAccountsServiceWrap) Create(ctx context.Context, name string, createserviceaccountrequest *iam.CreateServiceAccountRequest) Callable[*iam.ServiceAccount] {
	return p.ProjectsServiceAccountsService.Create(name, createserviceaccountrequest).Context(ctx)
}

func (p *ProjectsServiceAccountsServiceWrap) Delete(ctx context.Context, name string) Callable[*iam.Empty] {
	return p.ProjectsServiceAccountsService.Delete(name).Context(ctx)
}

func (p *ProjectsServiceAccountsServiceWrap) Get(ctx context.Context, name string) Callable[*iam.ServiceAccount] {
	return p.ProjectsServiceAccountsService.Get(name).Context(ctx)
}
func (p *ProjectsServiceAccountsServiceWrap) GetIamPolicy(ctx context.Context, resource string) Callable[*iam.Policy] {
	return p.ProjectsServiceAccountsService.GetIamPolicy(resource).Context(ctx)
}
func (p *ProjectsServiceAccountsServiceWrap) SetIamPolicy(ctx context.Context, resource string, setiampolicyrequest *iam.SetIamPolicyRequest) Callable[*iam.Policy] {
	return p.ProjectsServiceAccountsService.SetIamPolicy(resource, setiampolicyrequest).Context(ctx)
}

var _ Iamclient = &ProjectsServiceAccountsServiceWrap{}
