package configs

import (
	"errors"
	"fmt"
)

type Sinks struct {
	AzBlob AzBlobSink `toml:"azblob"`
	Gcs    GcsSink    `toml:"gcs"`
	Oss    OssSink    `toml:"oss"`
	S3     S3Sink     `toml:"s3"`
}

func (c *Sinks) Validate() error {
	if c.AzBlob.Enabled {
		return c.AzBlob.Validate()
	}
	if c.Gcs.Enabled {
		return c.Gcs.Validate()
	}
	if c.Oss.Enabled {
		return c.Oss.Validate()
	}
	if c.S3.Enabled {
		return c.S3.Validate()
	}
	return fmt.Errorf("no sinks enabled")
}

type AzBlobSink struct {
	Enabled          bool   `toml:"enabled"`
	AccountName      string `toml:"accountName"`
	AccountURL       string `toml:"accountUrl"`
	Container        string `toml:"container"`
	PathPrefix       string `toml:"pathPrefix"`
	ConnectionString string `toml:"connectionString"`
	CredentialsFile  string `toml:"credentialsFile"`
}

func (a *AzBlobSink) Validate() error {
	if a.Container == "" {
		return errors.New("sinks.azblob.container is required")
	}
	if a.ConnectionString == "" && a.AccountName == "" {
		return errors.New("sinks.azblob.connectionString or accountName is required")
	}
	return nil
}

type GcsSink struct {
	Enabled         bool   `toml:"enabled"`
	Bucket          string `toml:"bucket"`
	PathPrefix      string `toml:"pathPrefix"`
	CredentialsFile string `toml:"credentialsFile"`
	CredentialsJSON string `toml:"credentialsJson"`
}

func (g *GcsSink) Validate() error {
	if g.Bucket == "" {
		return errors.New("sinks.gcs.bucket is required")
	}
	return nil
}

type OssSink struct {
	Enabled         bool   `toml:"enabled"`
	Endpoint        string `toml:"endpoint"`
	Region          string `toml:"region"`
	Bucket          string `toml:"bucket"`
	PathPrefix      string `toml:"pathPrefix"`
	CredentialsFile string `toml:"credentialsFile"`
	AccessKeyID     string `toml:"accessKeyId"`
	AccessKeySecret string `toml:"accessKeySecret"`
	SecurityToken   string `toml:"securityToken"`
}

func (o *OssSink) Validate() error {
	if o.Endpoint == "" {
		return errors.New("sinks.oss.endpoint is required")
	}
	if o.Region == "" {
		return errors.New("sinks.oss.region is required")
	}
	if o.Bucket == "" {
		return errors.New("sinks.oss.bucket is required")
	}
	return nil
}

type S3Sink struct {
	Enabled    bool   `toml:"enabled"`
	Bucket     string `toml:"bucket"`
	Region     string `toml:"region"`
	RoleARN    string `toml:"roleArn"`
	ExternalID string `toml:"externalId"`
	PathPrefix string `toml:"pathPrefix"`
}

func (s *S3Sink) Validate() error {
	if s.Region == "" {
		return errors.New("sinks.s3.region is required")
	}
	if s.Bucket == "" {
		return errors.New("sinks.s3.bucket is required")
	}
	return nil
}
