package de.accso.flexinale.api_in.web;

import de.accso.flexinale.application.services.FilmService;
import de.accso.flexinale.domain.model.Besucher;
import de.accso.flexinale.domain.model.Film;
import de.accso.flexinale.domain.model.Vorfuehrung;
import de.accso.flexinale.infrastructure.security.BenutzerDetailsService;
import de.accso.flexinale.shared_kernel.Identifiable;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.server.ResponseStatusException;

import java.util.List;

@Controller
public class FilmWebController {
    @Autowired
    private FilmService filmService;

    @Autowired
    private BenutzerDetailsService benutzerService;

    @GetMapping(value="/filme")
    @PreAuthorize("hasRole('ROLE_BESUCHER')")
    @SuppressWarnings("SameReturnValue")
    public String filme(final Model model) {
        List<Film> filme = filmService.filme();
        model.addAttribute("filme", filme);
        return "filme";
    }

    @GetMapping(value="/film/{id}")
    @PreAuthorize("hasRole('ROLE_BESUCHER')")
    @SuppressWarnings("SameReturnValue")
    public String film(@PathVariable("id") final String id, final Model model) {
        Identifiable.Id filmId = Identifiable.Id.of(id);
        Film film = filmService.film(filmId);
        if (film == null) {
            throw new ResponseStatusException(HttpStatus.NOT_FOUND, "film %s not available".formatted(id));
        }
        else {
            model.addAttribute("film", film);
            List<Vorfuehrung> vorfuehrungenOfFilm = filmService.vorfuehrungenFuer(filmId);
            model.addAttribute("vorfuehrungen", vorfuehrungenOfFilm);

            if (!vorfuehrungenOfFilm.isEmpty()) {
                Besucher loggedinBesucher = benutzerService.getLoggedInBesucher();
                List<String> vorfuehrungenMitUeberlapp =
                        filmService.vorfuehrungenMitUeberlapp(vorfuehrungenOfFilm, loggedinBesucher)
                                .stream().map(it -> it.id()).toList();
                List<String> vorfuehrungenMitTicket =
                        filmService.vorfuehrungenFuerDieDerBenutzerEinTicketHat(vorfuehrungenOfFilm, loggedinBesucher)
                                .stream().map(it -> it.id()).toList();

                model.addAttribute("vorfuehrungenMitUeberlapp", vorfuehrungenMitUeberlapp);
                model.addAttribute("vorfuehrungenMitTicket", vorfuehrungenMitTicket);
            }
        }

        return "film";
    }
}
