package fr.titionfire.ffsaf.rest;

import fr.titionfire.ffsaf.rest.data.UserInfo;
import io.quarkus.security.Authenticated;
import io.quarkus.security.identity.SecurityIdentity;
import jakarta.inject.Inject;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.MediaType;
import jakarta.ws.rs.core.Response;
import org.eclipse.microprofile.config.inject.ConfigProperty;
import org.eclipse.microprofile.jwt.JsonWebToken;
import org.eclipse.microprofile.openapi.annotations.Operation;
import org.eclipse.microprofile.openapi.annotations.responses.APIResponse;
import org.eclipse.microprofile.openapi.annotations.responses.APIResponses;

import java.net.URI;
import java.net.URISyntaxException;

@Path("api/auth")
public class AuthEndpoints {

    @ConfigProperty(name = "login_redirect")
    String redirect;

    @Inject
    SecurityIdentity securityIdentity;

    @Inject
    JsonWebToken IdToken;

    @GET
    @Produces(MediaType.TEXT_PLAIN)
    @Operation(summary = "Vérifie si l'utilisateur est authentifié", description = "Cette méthode renvoie true si " +
            "l'utilisateur est authentifié et false sinon.")
    @APIResponses(value = {
            @APIResponse(responseCode = "200", description = "Réussite")
    })

    public Boolean auth() {
        return !securityIdentity.isAnonymous();
    }

    @GET
    @Path("/userinfo")
    @Authenticated
    @Produces(MediaType.APPLICATION_JSON)
    @Operation(summary = "Renvoie les informations de l'utilisateur authentifié", description = "Cette méthode renvoie les" +
            " informations de l'utilisateur authentifié sous forme d'objet JSON.")
    @APIResponses(value = {
            @APIResponse(responseCode = "200", description = "Réussite"),
            @APIResponse(responseCode = "401", description = "Utilisateur non authentifié")
    })
    public UserInfo userinfo() {
        return UserInfo.makeUserInfo(IdToken, securityIdentity);
    }

    @GET
    @Path("/login")
    @Authenticated
    @Produces(MediaType.TEXT_PLAIN)
    @Operation(hidden = true)
    public Response login() throws URISyntaxException {
        return Response.temporaryRedirect(new URI(redirect)).build();
    }
}
