using MesaFabApproval.API.Services;
using MesaFabApproval.Shared.Models;
using MesaFabApproval.Shared.Services;

using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;

namespace MesaFabApproval.API.Controllers;
[ApiController]
[Authorize]
public class ECNController : ControllerBase {
    private readonly ILogger<ApprovalController> _logger;
    private readonly IECNService _ecnService;
    private readonly IMonInWorkerClient _monInClient;

    public ECNController(ILogger<ApprovalController> logger, IECNService ecnService,
                              IMonInWorkerClient monInClient) {
        _logger = logger ?? throw new ArgumentNullException("ILogger not injected");
        _ecnService = ecnService ?? throw new ArgumentNullException("IECNService not injected");
        _monInClient = monInClient ?? throw new ArgumentNullException("IMonInWorkerClient not injected");
    }

    [HttpGet]
    [Route("ecn/isValidEcnNumber")]
    public async Task<IActionResult> IsValidEcnNumber(int number) {
        DateTime start = DateTime.Now;
        bool isInternalError = false;
        string errorMessage = "";

        try {
            _logger.LogInformation($"Attempting to determine if {number} is a valid ECN#");

            if (number <= 0) return Ok(false);

            bool isValid = await _ecnService.IsValidECNNumber(number);

            return Ok(isValid);
        } catch (Exception ex) {
            isInternalError = true;
            errorMessage = $"Cannot determine if {number} is a valid ECN#, because {ex.Message}";
            return Problem(errorMessage);
        } finally {
            string metricName = "IsValidEcnNumber";
            DateTime end = DateTime.Now;
            double millisecondsDiff = (end - start).TotalMilliseconds;
            _monInClient.PostAverage(metricName + "Latency", millisecondsDiff);

            if (isInternalError) {
                _logger.LogError(errorMessage);
                _monInClient.PostStatus(metricName, StatusValue.Critical);
            } else {
                _monInClient.PostStatus(metricName, StatusValue.Ok);
            }
        }
    }

    [HttpGet]
    [Route("ecn/allNumbers")]
    public async Task<IActionResult> GetAllECNNumbers() {
        DateTime start = DateTime.Now;
        bool isInternalError = false;
        string errorMessage = "";

        try {
            _logger.LogInformation($"Attempting to get all ECN#s");
            
            IEnumerable<int> allEcnNumbers = await _ecnService.GetAllECNNumbers();

            return Ok(allEcnNumbers);
        } catch (Exception ex) {
            isInternalError = true;
            errorMessage = $"Cannot get all ECN#s, because {ex.Message}";
            return Problem(errorMessage);
        } finally {
            string metricName = "GetAllECNNumbers";
            DateTime end = DateTime.Now;
            double millisecondsDiff = (end - start).TotalMilliseconds;
            _monInClient.PostAverage(metricName + "Latency", millisecondsDiff);

            if (isInternalError) {
                _logger.LogError(errorMessage);
                _monInClient.PostStatus(metricName, StatusValue.Critical);
            } else {
                _monInClient.PostStatus(metricName, StatusValue.Ok);
            }
        }
    }
}