package main

import (
	"crypto/sha1"
	"crypto/sha256"
	"encoding/base64"
	"encoding/hex"
	"mime"
	"os"
	"path"
	"strings"

	"github.com/pulumi/pulumi-aws/sdk/v5/go/aws"
	"github.com/pulumi/pulumi-aws/sdk/v5/go/aws/s3"
	"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)

func filebase64OrPanic(path string) string {
	if fileData, err := os.ReadFile(path); err == nil {
		return base64.StdEncoding.EncodeToString(fileData[:])
	} else {
		panic(err.Error())
	}
}

func filebase64sha256OrPanic(path string) string {
	if fileData, err := os.ReadFile(path); err == nil {
		hashedData := sha256.Sum256([]byte(fileData))
		return base64.StdEncoding.EncodeToString(hashedData[:])
	} else {
		panic(err.Error())
	}
}

func sha1Hash(input string) string {
	hash := sha1.Sum([]byte(input))
	return hex.EncodeToString(hash[:])
}

func main() {
	pulumi.Run(func(ctx *pulumi.Context) error {
		encoded := base64.StdEncoding.EncodeToString([]byte("haha business"))
		tmpVar0, _ := base64.StdEncoding.DecodeString(encoded)
		decoded := string(tmpVar0)
		_ = strings.Join([]string{
			encoded,
			decoded,
			"2",
		}, "-")
		// tests that we initialize "var, err" with ":=" first, then "=" subsequently (Go specific)
		_, err := aws.GetAvailabilityZones(ctx, nil, nil)
		if err != nil {
			return err
		}
		_, err = aws.GetAvailabilityZones(ctx, nil, nil)
		if err != nil {
			return err
		}
		bucket, err := s3.NewBucket(ctx, "bucket", nil)
		if err != nil {
			return err
		}
		_ = bucket.ID().ApplyT(func(id string) (pulumi.String, error) {
			return pulumi.String(base64.StdEncoding.EncodeToString([]byte(id))), nil
		}).(pulumi.StringOutput)
		_ = bucket.ID().ApplyT(func(id string) (pulumi.String, error) {
			value, _ := base64.StdEncoding.DecodeString(id)
			return pulumi.String(value), nil
		}).(pulumi.StringOutput)
		secretValue := pulumi.ToSecret("hello").(pulumi.StringOutput)
		_ = pulumi.Unsecret(secretValue).(pulumi.StringOutput)
		currentStack := ctx.Stack()
		currentProject := ctx.Project()
		workingDirectory := func(cwd string, err error) string {
			if err != nil {
				panic(err)
			}
			return cwd
		}(os.Getwd())
		fileMimeType := mime.TypeByExtension(path.Ext("./base64.txt"))
		// using the filebase64 function
		_, err = s3.NewBucketObject(ctx, "first", &s3.BucketObjectArgs{
			Bucket:      bucket.ID(),
			Source:      pulumi.NewStringAsset(filebase64OrPanic("./base64.txt")),
			ContentType: pulumi.String(fileMimeType),
			Tags: pulumi.StringMap{
				"stack":   pulumi.String(currentStack),
				"project": pulumi.String(currentProject),
				"cwd":     pulumi.String(workingDirectory),
			},
		})
		if err != nil {
			return err
		}
		// using the filebase64sha256 function
		_, err = s3.NewBucketObject(ctx, "second", &s3.BucketObjectArgs{
			Bucket: bucket.ID(),
			Source: pulumi.NewStringAsset(filebase64sha256OrPanic("./base64.txt")),
		})
		if err != nil {
			return err
		}
		// using the sha1 function
		_, err = s3.NewBucketObject(ctx, "third", &s3.BucketObjectArgs{
			Bucket: bucket.ID(),
			Source: pulumi.NewStringAsset(sha1Hash("content")),
		})
		if err != nil {
			return err
		}
		return nil
	})
}