package app.mealsmadeeasy.api.recipe.converter;

import app.mealsmadeeasy.api.image.converter.ImageToViewConverter;
import app.mealsmadeeasy.api.image.view.ImageView;
import app.mealsmadeeasy.api.recipe.RecipeDraft;
import app.mealsmadeeasy.api.recipe.view.RecipeDraftView;
import app.mealsmadeeasy.api.user.User;
import app.mealsmadeeasy.api.user.view.UserInfoView;
import lombok.RequiredArgsConstructor;
import org.jetbrains.annotations.Nullable;
import org.springframework.stereotype.Component;

import java.util.Comparator;

@Component
@RequiredArgsConstructor
public class RecipeDraftToViewConverter {

    private final ImageToViewConverter imageToViewConverter;

    public RecipeDraftView convert(RecipeDraft recipeDraft, User viewer) {
        final @Nullable ImageView mainImageView = recipeDraft.getMainImage() != null
                ? this.imageToViewConverter.convert(recipeDraft.getMainImage(), viewer, false)
                : null;
        final @Nullable RecipeDraftView.RecipeDraftInferenceView lastInference = recipeDraft.getInferences() != null
                ? recipeDraft.getInferences().stream()
                        .max(Comparator.comparing(RecipeDraft.RecipeDraftInference::getInferredAt))
                        .map(inference -> RecipeDraftView.RecipeDraftInferenceView.builder()
                                .inferredAt(inference.getInferredAt())
                                .title(inference.getTitle())
                                .rawText(inference.getRawText())
                                .build()
                        )
                        .orElse(null)
                : null;
        return RecipeDraftView.builder()
                .id(recipeDraft.getId())
                .created(recipeDraft.getCreated())
                .modified(recipeDraft.getModified())
                .state(recipeDraft.getState())
                .title(recipeDraft.getTitle())
                .slug(recipeDraft.getSlug())
                .preparationTime(recipeDraft.getPreparationTime())
                .cookingTime(recipeDraft.getCookingTime())
                .totalTime(recipeDraft.getTotalTime())
                .rawText(recipeDraft.getRawText())
                .ingredients(recipeDraft.getIngredients())
                .owner(UserInfoView.from(recipeDraft.getOwner()))
                .mainImage(mainImageView)
                .lastInference(lastInference)
                .build();
    }

}
