package com.pressing.modules.auth;

import com.pressing.modules.auth.dto.AuthResponse;
import com.pressing.modules.auth.dto.ChangeMyPasswordRequest;
import com.pressing.modules.auth.dto.ForgotPasswordRequest;
import com.pressing.modules.auth.dto.LoginRequest;
import com.pressing.modules.auth.dto.QuickResetPasswordRequest;
import com.pressing.modules.auth.dto.ResetPasswordRequest;
import com.pressing.security.UserPrincipal;
import com.pressing.tenant.TenantContext;
import jakarta.validation.Valid;
import java.util.Map;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/api/v1/auth")
public class AuthController {

    private final AuthService authService;

    public AuthController(AuthService authService) {
        this.authService = authService;
    }

    @PostMapping("/login")
    public AuthResponse login(@Valid @RequestBody LoginRequest request) {
        return authService.login(request);
    }

    @PostMapping("/select-site/{siteId}")
    public AuthResponse selectSite(@AuthenticationPrincipal UserPrincipal principal, @PathVariable Long siteId) {
        return authService.selectSite(principal.getUser(), siteId);
    }

    @GetMapping("/me")
    public AuthResponse me(@AuthenticationPrincipal UserPrincipal principal) {
        return authService.me(principal.getUser(), TenantContext.getSiteId());
    }

    @PostMapping("/forgot-password")
    public Map<String, String> forgotPassword(@Valid @RequestBody ForgotPasswordRequest request) {
        return authService.forgotPassword(request);
    }

    @PostMapping("/reset-password")
    public Map<String, String> resetPassword(@Valid @RequestBody ResetPasswordRequest request) {
        authService.resetPassword(request);
        return Map.of("message", "Mot de passe mis à jour");
    }



    // Endpoint pour qu'un Admin/Manager réinitialise le mot de passe d'un utilisateur
    @PostMapping("/admin/reset-user-password")
    public Map<String, String> quickResetPassword(@Valid @RequestBody QuickResetPasswordRequest request) {
        authService.quickResetPassword(request);
        return Map.of("message", "Mot de passe réinitialisé avec succès");
    }

    // Endpoint pour qu'un utilisateur connecté change son propre mot de passe
    @PostMapping("/change-password")
    public Map<String, String> changeMyPassword(
            @AuthenticationPrincipal UserPrincipal principal,
            @Valid @RequestBody ChangeMyPasswordRequest request
    ) {
        authService.changeMyPassword(principal.getUser(), request);
        return Map.of("message", "Votre mot de passe a été modifié avec succès");
    }
}
