package movie

import (
	"context"
	"fmt"

	"github.com/stashapp/stash/pkg/logger"
	"github.com/stashapp/stash/pkg/models"
	"github.com/stashapp/stash/pkg/models/json"
	"github.com/stashapp/stash/pkg/models/jsonschema"
	"github.com/stashapp/stash/pkg/utils"
)

type ImageGetter interface {
	GetFrontImage(ctx context.Context, movieID int) ([]byte, error)
	GetBackImage(ctx context.Context, movieID int) ([]byte, error)
}

// ToJSON converts a Movie into its JSON equivalent.
func ToJSON(ctx context.Context, reader ImageGetter, studioReader models.StudioGetter, movie *models.Movie) (*jsonschema.Movie, error) {
	newMovieJSON := jsonschema.Movie{
		Name:      movie.Name,
		Aliases:   movie.Aliases,
		Director:  movie.Director,
		Synopsis:  movie.Synopsis,
		URL:       movie.URL,
		CreatedAt: json.JSONTime{Time: movie.CreatedAt},
		UpdatedAt: json.JSONTime{Time: movie.UpdatedAt},
	}

	if movie.Date != nil {
		newMovieJSON.Date = movie.Date.String()
	}
	if movie.Rating != nil {
		newMovieJSON.Rating = *movie.Rating
	}
	if movie.Duration != nil {
		newMovieJSON.Duration = *movie.Duration
	}

	if movie.StudioID != nil {
		studio, err := studioReader.Find(ctx, *movie.StudioID)
		if err != nil {
			return nil, fmt.Errorf("error getting movie studio: %v", err)
		}

		if studio != nil {
			newMovieJSON.Studio = studio.Name
		}
	}

	frontImage, err := reader.GetFrontImage(ctx, movie.ID)
	if err != nil {
		logger.Errorf("Error getting movie front image: %v", err)
	}

	if len(frontImage) > 0 {
		newMovieJSON.FrontImage = utils.GetBase64StringFromData(frontImage)
	}

	backImage, err := reader.GetBackImage(ctx, movie.ID)
	if err != nil {
		logger.Errorf("Error getting movie back image: %v", err)
	}

	if len(backImage) > 0 {
		newMovieJSON.BackImage = utils.GetBase64StringFromData(backImage)
	}

	return &newMovieJSON, nil
}
