package ru.kayashov.bar.controller.dto.cocktail;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import ru.kayashov.bar.model.entity.CocktailEntity;
import ru.kayashov.bar.model.entity.Rating;
import ru.kayashov.bar.model.entity.TagEntity;

import java.util.List;
import java.util.stream.Collectors;

@Getter
@Setter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class CocktailForListResponseDto {
    private Long id;
    private String name;
    private String image;
    private String video;
    private String instructions;
    private Boolean inMenu;

    private String category;
    private String alcoholic;
    private String glass;

    private Integer volume;
    private Boolean hasError;

    private String tags;
    private String components;
    private Boolean isAllowed;

    private List<ReceiptResponseDto> receipt;

    private RatingResponseDto rating;

    public static CocktailForListResponseDto mapToDto(CocktailEntity e, Long visitorId) {
        CocktailForListResponseDto d = new CocktailForListResponseDto();
        d.setId(e.getId());
        d.setName(e.getName());
        d.setImage(e.getImage());
        d.setVideo(e.getVideo());
        d.setInstructions(e.getInstructions());

        d.setCategory(e.getCategoryEntity().getName());
        d.setAlcoholic(e.getAlcoholicEntity().getName());
        d.setGlass(e.getGlassEntity().getName());

//        d.setIsAllowed(e.getIsAllowed());

        d.setTags(e.getTags().stream().map(TagEntity::getName).collect(Collectors.joining(",")));

        String components = e.getReceipt().stream().map(r -> r.getIngredient().getName()).collect(Collectors.joining(", "));
        d.setComponents(components);
        d.setReceipt(e.getReceipt().stream().map(ReceiptResponseDto::mapToDto).toList());

        RatingResponseDto rating = new RatingResponseDto();
        int sum = 0;
        int count = 0;
        for (Rating current : e.getRating()) {
            //если у данного пользователя есть рейтинг для этого коктейля
            if (current.getVisitor().getId().equals(visitorId)) {
                //присваиваем избранное для конкретного пользователя
                rating.setFavourite(current.isFavorite());
                //проверяем, ставил данный пользователь свою оценку этому коктейлю, если да, берем ее и возвращаем рейтинг
                if (current.getRating() != 0) {
                    rating.setRating(current.getRating());
                    d.setRating(rating);
                    return d;
                }
            }
            //если пользователь ставил оценку, добавляем ее к сумме остальных оценок и увеличиваем количество оценивших
            if (current.getRating() > 0) {
                sum += current.getRating();
                count++;
            }
        }
        //если после всех итераций есть какая-то сумма оценок - вычисляем среднюю
        if (sum > 0) {
            rating.setRating(sum / count);
        }
        d.setRating(rating);
        return d;
    }
}
