package hdm.mi.sthbackend.controller;


import hdm.mi.sthbackend.exeptions.MatchIdNotFoundException;
import hdm.mi.sthbackend.exeptions.PlayerIdNotFoundException;
import hdm.mi.sthbackend.exeptions.TeamIdNotFoundException;
import hdm.mi.sthbackend.exeptions.TournamentIdNotFoundException;
import hdm.mi.sthbackend.model.Player;
import hdm.mi.sthbackend.model.Team;
import hdm.mi.sthbackend.model.Tournament;
import hdm.mi.sthbackend.service.TournamentService;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.*;

import java.util.UUID;

@RestController
@RequestMapping("/api/v1/tournaments")
@AllArgsConstructor
public class TournamentController {

    private final TournamentService service;

    /**
     * Player Endpoints
     **/
    @PatchMapping("/{tournamentId}/teams/{teamId}/players/{playerId}")
    public UUID updatePlayerName(@PathVariable UUID tournamentId,
                                 @PathVariable UUID teamId,
                                 @PathVariable UUID playerId,
                                 @RequestBody String newPlayerName) throws Exception {
        return service.updatePlayerName(tournamentId, teamId, playerId, newPlayerName);
    }

    /**
     * Team Endpoints
     **/
    @PostMapping("/{tournamentId}/teams")
    public Team createTeam(@PathVariable UUID tournamentId,
                           @RequestBody String teamName) throws TournamentIdNotFoundException {
        return service.createTeamFromTournament(tournamentId, teamName);
    }
    @DeleteMapping("/{tournamentId}/teams/{teamId}")
    public UUID removeTeamFromTournament(@PathVariable UUID tournamentId,
                                         @PathVariable UUID teamId) throws TournamentIdNotFoundException, TeamIdNotFoundException{
        return service.removeTeamFromTournament(tournamentId, teamId);
    }

    @PostMapping("/{tournamentId}/teams/{teamId}/addPlayer")
    public Player addPlayerToTeam(@PathVariable UUID tournamentId,
                                  @PathVariable UUID teamId,
                                  @RequestBody String playerName) throws Exception {
        return service.addPlayerToTeam(tournamentId, teamId, playerName);
    }

    @DeleteMapping("/{tournamentId}/teams/{teamId}/players/{playerId}")
    public Player removePlayerFromTeam(@PathVariable UUID tournamentId,
                                       @PathVariable UUID teamId,
                                       @PathVariable UUID playerId) throws PlayerIdNotFoundException, TournamentIdNotFoundException {   // muss hier die PlayerIdNotFoundException eingefügt werden,
        return service.removePlayerFromTeam(tournamentId, teamId, playerId);                                                            // wenn die nicht im TournamentService drin ist?
    }

    @PatchMapping
    public UUID determineWinner(@PathVariable UUID tournamentId,
                                @PathVariable UUID matchId) throws TournamentIdNotFoundException, MatchIdNotFoundException {
        return service.determineWinner(tournamentId, matchId);
    }



    /**
     * Tournament Endpoints
     */
    @PostMapping
    public Tournament createTournament(@RequestBody String tournamentName) {
        return service.createTournament(tournamentName);
    }

}