// An HTTPS server that serves a GCP bucket and makes it available to apko or any
// Alpine apk add call.
//
// APK_REPO_BUCKET is a required environment variable
package main

import (
	"context"
	"os"

	"cloud.google.com/go/storage"
	"google.golang.org/api/option"

	"edge-infra.dev/hack/tools/apk-repository/internal"
	"edge-infra.dev/pkg/lib/fog"
)

var (
	bind        = ":8080"
	credentials string
	bucket      string
	client      *storage.Client
)

func main() {
	ctx := context.Background()
	bucket = os.Getenv("APK_REPO_BUCKET")

	if bucket == "" {
		panic("must set bucket name in order to run")
	}

	if envBind := os.Getenv("APK_REPO_BIND_ADDRESS"); envBind != "" {
		bind = envBind
	}

	logger := fog.New()

	var err error
	if credentials != "" {
		client, err = storage.NewClient(ctx, option.WithCredentialsFile(credentials))
	} else {
		client, err = storage.NewClient(ctx)
	}

	if err != nil {
		logger.Error(err, "Failed to create client")
		panic(err)
	}

	bs, err := internal.NewBucketServer(ctx, client, bucket, logger)
	if err != nil {
		logger.Error(err, "Failed to create server")
		panic(err)
	}

	if err = bs.Run(bind); err != nil {
		panic(err)
	}
}