package gallery

import (
	"context"
	"fmt"

	"github.com/stashapp/stash/pkg/models"
)

type ImageUpdater interface {
	GetImageIDs(ctx context.Context, galleryID int) ([]int, error)
	AddImages(ctx context.Context, galleryID int, imageIDs ...int) error
	RemoveImages(ctx context.Context, galleryID int, imageIDs ...int) error
}

func (s *Service) Updated(ctx context.Context, galleryID int) error {
	galleryPartial := models.NewGalleryPartial()
	_, err := s.Repository.UpdatePartial(ctx, galleryID, galleryPartial)
	return err
}

// AddImages adds images to the provided gallery.
// It returns an error if the gallery does not support adding images, or if
// the operation fails.
func (s *Service) AddImages(ctx context.Context, g *models.Gallery, toAdd ...int) error {
	if err := validateContentChange(g); err != nil {
		return err
	}

	if err := s.Repository.AddImages(ctx, g.ID, toAdd...); err != nil {
		return fmt.Errorf("failed to add images to gallery: %w", err)
	}

	// #3759 - update the gallery's UpdatedAt timestamp
	return s.Updated(ctx, g.ID)
}

// RemoveImages removes images from the provided gallery.
// It does not validate if the images are part of the gallery.
// It returns an error if the gallery does not support removing images, or if
// the operation fails.
func (s *Service) RemoveImages(ctx context.Context, g *models.Gallery, toRemove ...int) error {
	if err := validateContentChange(g); err != nil {
		return err
	}

	if err := s.Repository.RemoveImages(ctx, g.ID, toRemove...); err != nil {
		return fmt.Errorf("failed to remove images from gallery: %w", err)
	}

	// #3759 - update the gallery's UpdatedAt timestamp
	return s.Updated(ctx, g.ID)
}

func AddPerformer(ctx context.Context, qb models.GalleryUpdater, o *models.Gallery, performerID int) error {
	galleryPartial := models.NewGalleryPartial()
	galleryPartial.PerformerIDs = &models.UpdateIDs{
		IDs:  []int{performerID},
		Mode: models.RelationshipUpdateModeAdd,
	}
	_, err := qb.UpdatePartial(ctx, o.ID, galleryPartial)
	return err
}

func AddTag(ctx context.Context, qb models.GalleryUpdater, o *models.Gallery, tagID int) error {
	galleryPartial := models.NewGalleryPartial()
	galleryPartial.TagIDs = &models.UpdateIDs{
		IDs:  []int{tagID},
		Mode: models.RelationshipUpdateModeAdd,
	}
	_, err := qb.UpdatePartial(ctx, o.ID, galleryPartial)
	return err
}
