// *** WARNING: this file was generated by test. ***
// *** Do not edit by hand unless you're certain you know what you are doing! ***

package example

import (
	"context"
	"reflect"

	"github.com/pulumi/pulumi-random/sdk/v2/go/random"
	"github.com/pulumi/pulumi/pkg/v3/codegen/internal/test/testdata/simple-methods-schema/go/example/nested"
	"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)

type Foo struct {
	pulumi.ResourceState
}

// NewFoo registers a new resource with the given unique name, arguments, and options.
func NewFoo(ctx *pulumi.Context,
	name string, args *FooArgs, opts ...pulumi.ResourceOption) (*Foo, error) {
	if args == nil {
		args = &FooArgs{}
	}

	var resource Foo
	err := ctx.RegisterRemoteComponentResource("example::Foo", name, args, &resource, opts...)
	if err != nil {
		return nil, err
	}
	return &resource, nil
}

type fooArgs struct {
}

// The set of arguments for constructing a Foo resource.
type FooArgs struct {
}

func (FooArgs) ElementType() reflect.Type {
	return reflect.TypeOf((*fooArgs)(nil)).Elem()
}

// A description of bar.
func (r *Foo) Bar(ctx *pulumi.Context, args *FooBarArgs) (FooBarResultOutput, error) {
	out, err := ctx.Call("example::Foo/bar", args, FooBarResultOutput{}, r)
	if err != nil {
		return FooBarResultOutput{}, err
	}
	return out.(FooBarResultOutput), nil
}

type fooBarArgs struct {
	Baz                 *nested.Baz       `pulumi:"baz"`
	BazPlain            *nested.Baz       `pulumi:"bazPlain"`
	BazRequired         nested.Baz        `pulumi:"bazRequired"`
	BoolValue           *bool             `pulumi:"boolValue"`
	BoolValuePlain      *bool             `pulumi:"boolValuePlain"`
	BoolValueRequired   bool              `pulumi:"boolValueRequired"`
	Name                *random.RandomPet `pulumi:"name"`
	NamePlain           *random.RandomPet `pulumi:"namePlain"`
	NameRequired        *random.RandomPet `pulumi:"nameRequired"`
	StringValue         *string           `pulumi:"stringValue"`
	StringValuePlain    *string           `pulumi:"stringValuePlain"`
	StringValueRequired string            `pulumi:"stringValueRequired"`
}

// The set of arguments for the Bar method of the Foo resource.
type FooBarArgs struct {
	Baz                 nested.BazPtrInput
	BazPlain            *nested.BazArgs
	BazRequired         nested.BazInput
	BoolValue           pulumi.BoolPtrInput
	BoolValuePlain      *bool
	BoolValueRequired   pulumi.BoolInput
	Name                random.RandomPetInput
	NamePlain           *random.RandomPet
	NameRequired        random.RandomPetInput
	StringValue         pulumi.StringPtrInput
	StringValuePlain    *string
	StringValueRequired pulumi.StringInput
}

func (FooBarArgs) ElementType() reflect.Type {
	return reflect.TypeOf((*fooBarArgs)(nil)).Elem()
}

type FooBarResult struct {
	SomeValue string `pulumi:"someValue"`
}

type FooBarResultOutput struct{ *pulumi.OutputState }

func (FooBarResultOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*FooBarResult)(nil)).Elem()
}

func (o FooBarResultOutput) SomeValue() pulumi.StringOutput {
	return o.ApplyT(func(v FooBarResult) string { return v.SomeValue }).(pulumi.StringOutput)
}

func (r *Foo) Baz(ctx *pulumi.Context) error {
	_, err := ctx.Call("example::Foo/baz", nil, pulumi.AnyOutput{}, r)
	return err
}

// Do something with something else
func (r *Foo) GenerateKubeconfig(ctx *pulumi.Context, args *FooGenerateKubeconfigArgs) (FooGenerateKubeconfigResultOutput, error) {
	out, err := ctx.Call("example::Foo/generateKubeconfig", args, FooGenerateKubeconfigResultOutput{}, r)
	if err != nil {
		return FooGenerateKubeconfigResultOutput{}, err
	}
	return out.(FooGenerateKubeconfigResultOutput), nil
}

type fooGenerateKubeconfigArgs struct {
	BoolValue bool `pulumi:"boolValue"`
}

// The set of arguments for the GenerateKubeconfig method of the Foo resource.
type FooGenerateKubeconfigArgs struct {
	BoolValue bool
}

func (FooGenerateKubeconfigArgs) ElementType() reflect.Type {
	return reflect.TypeOf((*fooGenerateKubeconfigArgs)(nil)).Elem()
}

type FooGenerateKubeconfigResult struct {
	Kubeconfig string `pulumi:"kubeconfig"`
}

type FooGenerateKubeconfigResultOutput struct{ *pulumi.OutputState }

func (FooGenerateKubeconfigResultOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*FooGenerateKubeconfigResult)(nil)).Elem()
}

func (o FooGenerateKubeconfigResultOutput) Kubeconfig() pulumi.StringOutput {
	return o.ApplyT(func(v FooGenerateKubeconfigResult) string { return v.Kubeconfig }).(pulumi.StringOutput)
}

type FooInput interface {
	pulumi.Input

	ToFooOutput() FooOutput
	ToFooOutputWithContext(ctx context.Context) FooOutput
}

func (*Foo) ElementType() reflect.Type {
	return reflect.TypeOf((*Foo)(nil))
}

func (i *Foo) ToFooOutput() FooOutput {
	return i.ToFooOutputWithContext(context.Background())
}

func (i *Foo) ToFooOutputWithContext(ctx context.Context) FooOutput {
	return pulumi.ToOutputWithContext(ctx, i).(FooOutput)
}

type FooOutput struct{ *pulumi.OutputState }

func (FooOutput) ElementType() reflect.Type {
	return reflect.TypeOf((*Foo)(nil))
}

func (o FooOutput) ToFooOutput() FooOutput {
	return o
}

func (o FooOutput) ToFooOutputWithContext(ctx context.Context) FooOutput {
	return o
}

func init() {
	pulumi.RegisterInputType(reflect.TypeOf((*FooInput)(nil)).Elem(), &Foo{})
	pulumi.RegisterOutputType(FooOutput{})
	pulumi.RegisterOutputType(FooBarResultOutput{})
	pulumi.RegisterOutputType(FooGenerateKubeconfigResultOutput{})
}
