using Managing.Api.Authorization;
using Managing.Api.Models.Requests;
using Managing.Application.Abstractions.Services;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;

namespace Managing.Api.Controllers;

/// <summary>
/// Provides authentication-related actions, including token creation for user authentication.
/// </summary>
[ApiController]
[Route("[controller]")]
[Produces("application/json")]
public class UserController : ControllerBase
{
    private IConfiguration _config;
    private readonly IUserService _userService;
    private readonly IJwtUtils _jwtUtils;

    /// <summary>
    /// Initializes a new instance of the <see cref="UserController"/> class.
    /// </summary>
    /// <param name="config">Configuration settings.</param>
    /// <param name="userService">Service for user-related operations.</param>
    /// <param name="jwtUtils">Utility for JWT token operations.</param>
    public UserController(IConfiguration config, IUserService userService, IJwtUtils jwtUtils)
    {
        _config = config;
        _userService = userService;
        _jwtUtils = jwtUtils;
    }

    /// <summary>
    /// Creates a JWT token for a user based on the provided login credentials.
    /// </summary>
    /// <param name="login">The login request containing user credentials.</param>
    /// <returns>A JWT token if authentication is successful; otherwise, an Unauthorized result.</returns>
    [AllowAnonymous]
    [HttpPost]
    public async Task<ActionResult<string>> CreateToken([FromBody] LoginRequest login)
    {
        var user = await _userService.Authenticate(login.Name, login.Address, login.Message, login.Signature);

        if (user != null)
        {
            var tokenString = _jwtUtils.GenerateJwtToken(user, login.Address);
            return Ok(tokenString);
        }

        return Unauthorized();
    }
}