using Application.Abstractions.Interfaces;
using Application.DTOs.RobotDTOs;
using Application.DTOs.UserDTOs;
using Entities;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using System.Threading.Tasks;
using IAuthService = Application.Abstractions.Interfaces.IAuthorizationService;
namespace RobDeliveryAPI.Controllers
{
[ApiController]
[Route("api/[controller]")]
public class AuthController : ControllerBase
{
private readonly ITokenService _tokenService;
private readonly IAuthService _authorizationService;
private readonly IRobotService _robotService;
public AuthController(
ITokenService tokenService,
IAuthService authorizationService,
IRobotService robotService)
{
_tokenService = tokenService;
_authorizationService = authorizationService;
_robotService = robotService;
}
///
/// Register a new user. If account already exists — auto-login.
/// Google registration returns NeedsAdditionalInfo if user is new (redirect to complete-profile).
///
[AllowAnonymous]
[HttpPost("register")]
public async Task Register(UserRegisterDTO registerData)
{
var result = await _authorizationService.RegisterOrLoginAsync(registerData);
if (result.Status == "Error")
{
return BadRequest(result);
}
return Ok(result);
}
///
/// Login user. Google login auto-registers if user doesn't exist (returns NeedsAdditionalInfo).
///
[AllowAnonymous]
[HttpPost("login")]
public async Task Login(UserLoginDTO loginData)
{
var result = await _authorizationService.LoginOrRegisterAsync(loginData);
if (result.Status == "Error")
{
return BadRequest(result);
}
return Ok(result);
}
///
/// Complete Google registration with additional info (phone number, map location).
/// Called after Google auth returns NeedsAdditionalInfo.
///
[AllowAnonymous]
[HttpPost("complete-google-registration")]
public async Task CompleteGoogleRegistration(CompleteGoogleRegDTO data)
{
var result = await _authorizationService.CompleteGoogleRegistrationAsync(data);
if (result.Status == "Error")
{
return BadRequest(result);
}
return Ok(result);
}
[AllowAnonymous]
[HttpPost("robot/register")]
public async Task RegisterRobot(RobotRegisterDTO registerData)
{
// Use RobotService to register robot (follows Clean Architecture)
var (success, robotId, errorMessage) = await _robotService.RegisterRobotAsync(registerData);
if (!success)
{
return BadRequest(new { error = errorMessage });
}
// Generate token for the robot
var token = await _tokenService.GenerateRobotToken(robotId!.Value);
// Get robot details for response
var robot = await _robotService.GetRobotByIdAsync(robotId.Value);
return Ok(new
{
message = "Robot registered successfully",
robotId = robotId.Value,
serialNumber = registerData.SerialNumber,
token
});
}
[AllowAnonymous]
[HttpPost("robot/login")]
public async Task LoginRobot(RobotLoginDTO loginData)
{
// Use RobotService to authenticate robot (follows Clean Architecture)
var (success, robotId, errorMessage) = await _robotService.AuthenticateRobotAsync(loginData);
if (!success)
{
return Unauthorized(new { error = errorMessage });
}
// Generate token for the authenticated robot
var token = await _tokenService.GenerateRobotToken(robotId!.Value);
// Get robot details for response
var robot = await _robotService.GetRobotByIdAsync(robotId.Value);
return Ok(new
{
message = "Robot login successful",
robotId = robotId.Value,
serialNumber = robot?.SerialNumber,
robotName = robot?.Name,
token
});
}
}
}