using Microsoft.AspNetCore.Mvc;
using administration.Models;
using administration.Services;

namespace administration.Controllers
{
    [ApiController]
    [Route("api/[controller]")]
    public class RevenueController : ControllerBase
    {
        private readonly FinancesContext _context;
        private readonly IUserSessionService _userSession;

        public RevenueController(FinancesContext context, IUserSessionService userSession)
        {
            _context = context;
            _userSession = userSession;
        }

        /// <summary>  
        /// Récupère les X derniers revenues depuis la base de données.  
        /// </summary>  
        /// <param name="rows">Nombre de lignes à retourner</param>  
        /// <returns>Liste des revenues</returns>  
        [HttpGet("x_revenues")]
        public IActionResult GetXRevenues([FromQuery] int rows = 1)
        {
            try
            {
                if (_userSession.UserId == null)
                    return Unauthorized("Utilisateur non connecté.");

                var revenues = _context.Revenues
                    .Where(r => r.UserId == _userSession.UserId)
                    .OrderByDescending(r => r.Id)
                    .Take(rows)
                    .ToList();

                return Ok(revenues);
            }
            catch (Exception ex)
            {
                return StatusCode(500, $"Erreur serveur : {ex.Message}, Méthode GetXRevenues");
            }
        }

        /// <summary>  
        /// Récupère le dernier revenue depuis la base de données.  
        /// </summary>  
        /// <returns>Le dernier revenue</returns>  
        [HttpGet("last_revenue")]
        public IActionResult GetLastRevenues()
        {
            try
            {
                if (_userSession.UserId == null)
                    return Unauthorized("Utilisateur non connecté.");

                var revenue = _context.Revenues
                    .Where(r => r.UserId == _userSession.UserId)
                    .OrderByDescending(r => r.Id)
                    .FirstOrDefault();

                return Ok(revenue);
            }
            catch (Exception ex)
            {
                return StatusCode(500, $"Erreur serveur : {ex.Message}, Méthode GetLastRevenues");
            }
        }

        /// <summary>  
        /// Récupère tous les revenues depuis la base de données.  
        /// </summary>  
        /// <returns>Liste de revenues</returns>  
        [HttpGet("all_revenues")]
        public IActionResult GetAllRevenues()
        {
            try
            {
                if (_userSession.UserId == null)
                    return Unauthorized("Utilisateur non connecté.");

                var revenues = _context.Revenues
                    .Where(r => r.UserId == _userSession.UserId)
                    .OrderByDescending(r => r.Id)
                    .ToList();

                return Ok(revenues);
            }
            catch (Exception ex)
            {
                return StatusCode(500, $"Erreur serveur : {ex.Message}, Méthode GetAllRevenues");
            }
        }

        /// <summary>  
        /// Récupère toutes les ressources supplémentaires dont le type de transaction contient "revenu".
        /// </summary>  
        /// <returns>Liste des ressources supplémentaires</returns>  
        [HttpGet("additional_revenues")]
        public IActionResult GetAdditionalRevenues()
        {
            try
            {
                if (_userSession.UserId == null)
                    return Unauthorized("Utilisateur non connecté.");

                var revenus = _context.AdditionalSources
                    .Where(r => r.UserId == _userSession.UserId &&
                                r.TransactionType.ToLower().Contains("revenu") &&
                                r.Date.Month == DateTime.Now.Month)
                    .OrderByDescending(r => r.Id)
                    .ToList();

                return Ok(revenus);
            }
            catch (Exception ex)
            {
                return StatusCode(500, $"Erreur serveur : {ex.Message}, Méthode GetAdditionalRevenues");
            }
        }


    }
}
