using AutoMapper;
using Microsoft.AspNetCore.Cors;
using Microsoft.AspNetCore.Mvc;
using skydiveLogs_api.DataContract;
using skydiveLogs_api.DomainBusiness.Interfaces;
using System.Collections.Generic;

namespace skydiveLogs_api.Controllers
{
    public class StatsController : Base
    {
        #region Public Constructors

        public StatsController(IStatsService statsService,
                               IMapper mapper)
        {
            _statsService = statsService;
            _mapper = mapper;
        }

        #endregion Public Constructors

        #region Public Methods

        /// <summary>
        /// Retrieves statistics grouped by aircraft.
        /// </summary>
        /// <returns>A collection of StatisticResp objects containing aircraft statistics.</returns>
        [HttpGet("ByAircraft")]
        [EnableCors]
        public IEnumerable<StatisticResp> ByAircraft()
        {
            var result = _statsService.GetStatsByAircraft();

            return _mapper.Map<IEnumerable<StatisticResp>>(result);
        }

        /// <summary>
        /// Retrieves statistics grouped by drop zone.
        /// </summary>
        /// <returns>A collection of StatisticResp objects containing drop zone statistics.</returns>
        [HttpGet("ByDz")]
        [EnableCors]
        public IEnumerable<StatisticResp> ByDz()
        {
            var result = _statsService.GetStatsByDz();

            return _mapper.Map<IEnumerable<StatisticResp>>(result);
        }

        /// <summary>
        /// Retrieves statistics grouped by gear.
        /// </summary>
        /// <returns>A collection of StatisticResp objects containing gear statistics.</returns>
        [HttpGet("ByGear")]
        [EnableCors]
        public IEnumerable<StatisticResp> ByGear()
        {
            var result = _statsService.GetStatsByGear();

            return _mapper.Map<IEnumerable<StatisticResp>>(result);
        }

        /// <summary>
        /// Retrieves statistics grouped by jump type.
        /// </summary>
        /// <returns>A collection of StatisticResp objects containing jump type statistics.</returns>
        [HttpGet("ByJumpType")]
        [EnableCors]
        public IEnumerable<StatisticResp> ByJumpType()
        {
            var result = _statsService.GetStatsByJumpType();

            return _mapper.Map<IEnumerable<StatisticResp>>(result);
        }

        /// <summary>
        /// Retrieves statistics grouped by year.
        /// </summary>
        /// <returns>A collection of StatisticResp objects containing year statistics.</returns>
        [HttpGet("ByYear")]
        [EnableCors]
        public IEnumerable<StatisticResp> ByYear()
        {
            var result = _statsService.GetStatsByYear();

            return _mapper.Map<IEnumerable<StatisticResp>>(result);
        }

        /// <summary>
        /// Retrieves statistics for the last month grouped by drop zone and jump type.
        /// </summary>
        /// <returns>A StatisticForLastMonthResp object containing last month statistics.</returns>
        [HttpGet("ForLastMonth")]
        [EnableCors]
        public StatisticForLastMonthResp ForLastMonth()
        {
            var resultByDz = _statsService.GetStatsForLastMonthByDz();
            var resultByJumpType = _statsService.GetStatsForLastMonthByJumpType();

            var result = new StatisticForLastMonthResp();
            result.ByDz = _mapper.Map<IEnumerable<StatisticResp>>(resultByDz);
            result.ByJumpType = _mapper.Map<IEnumerable<StatisticResp>>(resultByJumpType);

            return result;
        }

        /// <summary>
        /// Retrieves statistics for the last year grouped by drop zone and jump type.
        /// </summary>
        /// <returns>A StatisticForLastYearResp object containing last year statistics.</returns>
        [HttpGet("ForLastYear")]
        [EnableCors]
        public StatisticForLastYearResp ForLastYear()
        {
            var resultByDz = _statsService.GetStatsForLastYearByDz();
            var resultByJumpType = _statsService.GetStatsForLastYearByJumpType();

            var result = new StatisticForLastYearResp();
            result.ByDz = _mapper.Map<IEnumerable<StatisticResp>>(resultByDz);
            result.ByJumpType = _mapper.Map<IEnumerable<StatisticResp>>(resultByJumpType);

            return result;
        }

        /// <summary>
        /// Retrieves statistics by year grouped with jump type for chart visualization.
        /// </summary>
        /// <returns>A collection of StatisticForChartResp objects containing yearly jump type statistics.</returns>
        [HttpGet("ByYearByJumpType")]
        [EnableCors]
        public IEnumerable<StatisticForChartResp> ByYearByJumpType()
        {
            var result = _statsService.GetStatsByYearByJumpType();

            return _mapper.Map<IEnumerable<StatisticForChartResp>>(result);
        }

        /// <summary>
        /// Resets all statistics to their initial state.
        /// </summary>
        [HttpGet("Reset")]
        [EnableCors]
        public void Reset()
        {
            _statsService.Reset();
        }

        /// <summary>
        /// Retrieves a simple summary of all statistics.
        /// </summary>
        /// <returns>A SimpleSummaryResp object containing the simple summary statistics.</returns>
        [HttpGet("Simple")]
        [EnableCors]
        public SimpleSummaryResp Simple()
        {
            var result = _statsService.GetSimpleSummary();

            return _mapper.Map<SimpleSummaryResp>(result);
        }

        #endregion Public Methods

        #region Private properties

        private readonly IMapper _mapper;
        private readonly IStatsService _statsService;

        #endregion Private properties
    }
}
