package models

import "context"

// GalleryGetter provides methods to get galleries by ID.
type GalleryGetter interface {
	// TODO - rename this to Find and remove existing method
	FindMany(ctx context.Context, ids []int) ([]*Gallery, error)
	Find(ctx context.Context, id int) (*Gallery, error)
}

// GalleryFinder provides methods to find galleries.
type GalleryFinder interface {
	GalleryGetter
	FindByFingerprints(ctx context.Context, fp []Fingerprint) ([]*Gallery, error)
	FindByChecksum(ctx context.Context, checksum string) ([]*Gallery, error)
	FindByChecksums(ctx context.Context, checksums []string) ([]*Gallery, error)
	FindByPath(ctx context.Context, path string) ([]*Gallery, error)
	FindByFileID(ctx context.Context, fileID FileID) ([]*Gallery, error)
	FindByFolderID(ctx context.Context, folderID FolderID) ([]*Gallery, error)
	FindBySceneID(ctx context.Context, sceneID int) ([]*Gallery, error)
	FindByImageID(ctx context.Context, imageID int) ([]*Gallery, error)
	FindUserGalleryByTitle(ctx context.Context, title string) ([]*Gallery, error)
}

// GalleryQueryer provides methods to query galleries.
type GalleryQueryer interface {
	Query(ctx context.Context, galleryFilter *GalleryFilterType, findFilter *FindFilterType) ([]*Gallery, int, error)
	QueryCount(ctx context.Context, galleryFilter *GalleryFilterType, findFilter *FindFilterType) (int, error)
}

// GalleryCounter provides methods to count galleries.
type GalleryCounter interface {
	Count(ctx context.Context) (int, error)
	CountByFileID(ctx context.Context, fileID FileID) (int, error)
}

// GalleryCreator provides methods to create galleries.
type GalleryCreator interface {
	Create(ctx context.Context, newGallery *Gallery, fileIDs []FileID) error
}

// GalleryUpdater provides methods to update galleries.
type GalleryUpdater interface {
	Update(ctx context.Context, updatedGallery *Gallery) error
	UpdatePartial(ctx context.Context, id int, updatedGallery GalleryPartial) (*Gallery, error)
	UpdateImages(ctx context.Context, galleryID int, imageIDs []int) error
}

// GalleryDestroyer provides methods to destroy galleries.
type GalleryDestroyer interface {
	Destroy(ctx context.Context, id int) error
}

type GalleryCreatorUpdater interface {
	GalleryCreator
	GalleryUpdater
}

// GalleryReader provides all methods to read galleries.
type GalleryReader interface {
	GalleryFinder
	GalleryQueryer
	GalleryCounter

	URLLoader
	FileIDLoader
	ImageIDLoader
	SceneIDLoader
	PerformerIDLoader
	TagIDLoader
	FileLoader

	All(ctx context.Context) ([]*Gallery, error)
}

// GalleryWriter provides all methods to modify galleries.
type GalleryWriter interface {
	GalleryCreator
	GalleryUpdater
	GalleryDestroyer

	AddFileID(ctx context.Context, id int, fileID FileID) error
	AddImages(ctx context.Context, galleryID int, imageIDs ...int) error
	RemoveImages(ctx context.Context, galleryID int, imageIDs ...int) error
}

// GalleryReaderWriter provides all gallery methods.
type GalleryReaderWriter interface {
	GalleryReader
	GalleryWriter
}
