package com.social.media.interfaces.web.controller;

import com.social.media.application.exception.AuthenticationException;
import com.social.media.application.exception.RegistrationException;
import com.social.media.application.service.AuthService;
import com.social.media.interfaces.web.dto.auth.LoginRequest;
import com.social.media.interfaces.web.dto.auth.LoginResponse;
import com.social.media.interfaces.web.dto.auth.RefreshTokenRequest;
import com.social.media.interfaces.web.dto.error.ErrorResponse;
import com.social.media.interfaces.web.dto.user.UserResponse;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.validation.Valid;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDateTime;
import java.util.Map;

/**
 * REST Controller for Authentication operations
 */
@RestController
@RequestMapping("/api/auth")
public class AuthController {

    private final AuthService authService;

    public AuthController(AuthService authService) {
        this.authService = authService;
    }

    /**
     * User login / Sign in
     */
    @PostMapping("/signin")
    public ResponseEntity<LoginResponse> signin(@Valid @RequestBody LoginRequest request) {
        LoginResponse response = authService.signin(request);
        return ResponseEntity.ok(response);
    }

    /**
     * User registration / Sign up
     */
    @PostMapping("/signup")
    public ResponseEntity<LoginResponse> signup(@Valid @RequestBody com.social.media.interfaces.web.dto.auth.RegisterRequest request) {
        LoginResponse response = authService.signup(request);
        return ResponseEntity.status(HttpStatus.CREATED).body(response);
    }

    /**
     * Refresh authentication token
     */
    @PostMapping("/refresh")
    public ResponseEntity<LoginResponse> refreshToken(@Valid @RequestBody RefreshTokenRequest request) {
        LoginResponse response = authService.refreshToken(request.refreshToken());
        return ResponseEntity.ok(response);
    }

    /**
     * Get current authenticated user profile
     */
    @GetMapping("/me")
    public ResponseEntity<UserResponse> getCurrentUser(@RequestHeader("Authorization") String authHeader) {
        // Extract token from Bearer header
        if (authHeader == null || !authHeader.startsWith("Bearer ")) {
            throw AuthenticationException.missingToken();
        }
        
        String token = authHeader.substring(7);
        UserResponse user = authService.getCurrentUser(token);
        return ResponseEntity.ok(user);
    }

    /**
     * User logout
     */
    @PostMapping("/logout")
    public ResponseEntity<Map<String, String>> logout(@RequestHeader("Authorization") String authHeader) {
        // Extract token from Bearer header
        if (authHeader == null || !authHeader.startsWith("Bearer ")) {
            throw AuthenticationException.missingToken();
        }
        
        String token = authHeader.substring(7);
        authService.logout(token);
        
        return ResponseEntity.ok(Map.of(
            "message", "Logout realizado com sucesso",
            "timestamp", LocalDateTime.now().toString()
        ));
    }

    /**
     * Authentication health check
     */
    @GetMapping("/health")
    public ResponseEntity<Map<String, Object>> health() {
        return ResponseEntity.ok(Map.of(
            "status", "UP",
            "service", "Authentication Service",
            "timestamp", LocalDateTime.now(),
            "features", Map.of(
                "login", "available",
                "register", "available", 
                "refresh", "available",
                "logout", "available"
            )
        ));
    }
}
