package static

import (
	"context"
	"database/sql"
	"io"
	"time"
)

type CreateStorage func(client *sql.DB, rawConfig map[string]interface{}) (Storage, error)

type Storage interface {
	PutObject(ctx context.Context, instanceID, location, resourceOwner, name, contentType string, objectType ObjectType, object io.Reader, objectSize int64) (*Asset, error)
	GetObject(ctx context.Context, instanceID, resourceOwner, name string) ([]byte, func() (*Asset, error), error)
	GetObjectInfo(ctx context.Context, instanceID, resourceOwner, name string) (*Asset, error)
	RemoveObject(ctx context.Context, instanceID, resourceOwner, name string) error
	RemoveObjects(ctx context.Context, instanceID, resourceOwner string, objectType ObjectType) error
	RemoveInstanceObjects(ctx context.Context, instanceID string) error
	//TODO: add functionality to move asset location
}

type ObjectType int32

const (
	ObjectTypeUserAvatar ObjectType = iota
	ObjectTypeStyling
)

func (o ObjectType) String() string {
	switch o {
	case ObjectTypeUserAvatar:
		return "0"
	case ObjectTypeStyling:
		return "1"
	default:
		return ""
	}
}

type Asset struct {
	InstanceID    string
	ResourceOwner string
	Name          string
	Hash          string
	Size          int64
	LastModified  time.Time
	Location      string
	ContentType   string
}

func (a *Asset) VersionedName() string {
	return a.Name + "?v=" + a.Hash
}