package media

import (
	"context"
	"errors"

	"git.agecem.com/agecem/agecem-org/config"
	"github.com/minio/minio-go/v7"
	"github.com/minio/minio-go/v7/pkg/credentials"
	"github.com/spf13/viper"
)

func NewMediaClient(endpoint, accessKeyId, secretAccessKey string, useSSL bool) (*MediaClient, error) {
	if accessKeyId == "" {
		return nil, errors.New("accessKeyId was found empty, but cannot be")
	}

	if secretAccessKey == "" {
		return nil, errors.New("secretAccessKey was found empty, but cannot be")
	}

	var mediaClient MediaClient
	minioClient, err := minio.New(endpoint, &minio.Options{
		Creds:  credentials.NewStaticV4(accessKeyId, secretAccessKey, ""),
		Secure: useSSL,
	})
	if err != nil {
		return &mediaClient, err
	}

	mediaClient.MinioClient = *minioClient
	return &mediaClient, nil
}

func NewMediaClientFromViper() (*MediaClient, error) {
	var cfg config.Config
	if err := viper.Unmarshal(&cfg); err != nil {
		return nil, err
	}

	mediaClient, err := NewMediaClient(cfg.Server.Documents.Endpoint, cfg.Server.Documents.AccessKeyId, cfg.Server.Documents.SecretAccessKey, cfg.Server.Documents.UseSSL)
	if err != nil {
		return mediaClient, err
	}

	return mediaClient, nil
}

type MediaClient struct {
	MinioClient minio.Client
}

func (m *MediaClient) Seed() ([]string, error) {
	var cfg config.Config
	if err := viper.Unmarshal(&cfg); err != nil {
		return nil, err
	}

	var new_buckets []string

	for bucket := range cfg.Server.Documents.Buckets {
		exists, err := m.MinioClient.BucketExists(context.Background(), bucket)
		if err != nil {
			return new_buckets, err
		}

		if exists {
			continue
		}

		if err = m.MinioClient.MakeBucket(context.Background(), bucket, minio.MakeBucketOptions{}); err != nil {
			return new_buckets, err
		}
		new_buckets = append(new_buckets, bucket)
	}

	return new_buckets, nil
}
