using System.Threading.Tasks;
using Hangfire;
using Lada.Framework.Infrastructures.Services;
using Ladaer.BackEnd.Infrastructures.Services;
using Ladaer.BackEnd.Infrastructures.Services.Categories;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;

namespace Ladaer.BackEnd.Controllers.Systems
{
    /// <summary>
    /// Controller để xử lý các hoạt động liên quan tới Google Maps.
    /// </summary>
    [Route("api/[controller]")]
    [ApiController]
    [Authorize]
    public class GoogleMapController : ControllerBase
    {
        private readonly IGoogleMapService _googleMapService;
        private readonly ILocationService _locationService;

        /// <summary>
        /// Khởi tạo một instance mới của lớp <see cref="GoogleMapController"/>.
        /// </summary>
        /// <param name="googleMapService">Dịch vụ xử lý Google Maps.</param>
        /// <param name="locationService">Dịch vụ xử lý địa điểm.</param>
        public GoogleMapController(IGoogleMapService googleMapService, ILocationService locationService)
        {
            _googleMapService = googleMapService;
            _locationService = locationService;
        }

        /// <summary>
        /// Kích hoạt công việc lấy tọa độ (lat, long) của phường/xã.
        /// </summary>
        /// <returns>Thông báo kết quả kích hoạt công việc.</returns>
        [HttpGet("GetLatLngJob")]
        [AllowAnonymous]
        public IActionResult GetLatLngJob()
        {
            try
            {
                RecurringJob.AddOrUpdate("UpdateWardLatLong", () => _locationService.UpdateWardLatLong(), Cron.Minutely());
                return Ok("GetLatLngJob - Kích hoạt công việc lấy tọa độ (lat, long) của phường/xã");
            }
            catch (Exception ex)
            {
                return BadRequest(ex.Message);
            }
        }

        /// <summary>
        /// Kích hoạt công việc lấy khoảng cách của EndPoints.
        /// </summary>
        /// <returns>Thông báo kết quả kích hoạt công việc.</returns>
        [HttpGet("GetDistanceJob")]
        [AllowAnonymous]
        public async Task<IActionResult> GetDistanceJob()
        {
            try
            {
                RecurringJob.AddOrUpdate("GetDistanceJob", () => _locationService.UpdateEndPointsDistance(), Cron.Minutely());
                //return Ok("GetDistanceJob - �� k�ch ho?t t? d?ng l?y kho?ng c�ch c?a EndPoints");

                //await _locationService.UpdateEndPointsDistance();
                return Ok("GetDistanceJob - Kích hoạt công việc lấy khoảng cách của EndPoints");
            }
            catch (Exception ex)
            {
                return BadRequest(ex.Message);
            }
        }
    }
}
