using Lada.Framework.Infrastructures.Helpers;
using Ladaer.BackEnd.Infrastructures.DTO.Models.Categories;
using Ladaer.BackEnd.Infrastructures.Services.Categories;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;

namespace Ladaer.BackEnd.Controllers.Systems
{
    /// <summary>
    /// Controller để xử lý các hoạt động liên quan đến vùng phủ của đại lý
    /// </summary>
    [Route("api/[controller]")]
    [ApiController]
    [Authorize]
    public class AgencyLocationController : ControllerBase
    {
        private readonly IAgencyLocationService _agencyLocationService;

        /// <summary>
        /// Khởi tạo một instance mới của lớp <see cref="AgencyLocationController"/>.
        /// </summary>
        /// <param name="agencyLocationService">Service xử lý vùng phủ của đại lý</param>
        public AgencyLocationController(IAgencyLocationService agencyLocationService)
        {
            _agencyLocationService = agencyLocationService;
        }

        /// <summary>
        /// Lấy thông tin vùng phủ của đại lý
        /// </summary>
        /// <param name="agencyId">ID của đại lý</param>
        /// <returns>Thông tin vùng phủ bao gồm danh sách location</returns>
        [HttpGet("GetAgencyCoverage")]
        [Authorize(Roles = "AgencyLocation.GetAgencyCoverage")]
        public async Task<IActionResult> GetAgencyCoverage(int agencyId)
        {
            if (agencyId <= 0)
            {
                return BadRequest("AgencyId không hợp lệ");
            }

            var result = await _agencyLocationService.GetAgencyCoverage(agencyId);
            return Ok(result);
        }

        /// <summary>
        /// Thêm location vào đại lý
        /// </summary>
        /// <param name="model">Model chứa AgencyId và danh sách LocationIds cần thêm</param>
        /// <returns>Kết quả của hoạt động thêm</returns>
        [HttpPost("AddLocation")]
        [Authorize(Roles = "AgencyLocation.AddLocation")]
        public async Task<IActionResult> AddLocation([FromBody] AddLocationsToAgencyModel model)
        {
            if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }

            if (model.AgencyId <= 0)
            {
                return BadRequest("AgencyId không hợp lệ");
            }

            var currentUser = User.GetCurrentUser();
            model.UpdatedBy = currentUser.UserId;
            model.UpdatedByUserName = currentUser.UserName;

            if (model.UpdatedBy <= 0 || string.IsNullOrEmpty(model.UpdatedByUserName))
            {
                return BadRequest("Không xác định được người dùng");
            }

            var result = await _agencyLocationService.AddLocationToAgency(model);
            return Ok(result);
        }

        /// <summary>
        /// Xóa location khỏi đại lý
        /// </summary>
        /// <param name="model">Model chứa AgencyId và danh sách LocationIds cần xóa</param>
        /// <returns>Kết quả của hoạt động xóa</returns>
        [HttpPost("RemoveLocation")]
        [Authorize(Roles = "AgencyLocation.RemoveLocation")]
        public async Task<IActionResult> RemoveLocation([FromBody] AddLocationsToAgencyModel model)
        {
            if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }

            if (model.AgencyId <= 0)
            {
                return BadRequest("AgencyId không hợp lệ");
            }

            var currentUser = User.GetCurrentUser();
            model.UpdatedBy = currentUser.UserId;
            model.UpdatedByUserName = currentUser.UserName;

            if (model.UpdatedBy <= 0 || string.IsNullOrEmpty(model.UpdatedByUserName))
            {
                return BadRequest("Không xác định được người dùng");
            }

            var result = await _agencyLocationService.RemoveLocationFromAgency(model);
            return Ok(result);
        }

        /// <summary>
        /// Lấy danh sách location chưa được gán cho đại lý dưới dạng cây (lazy loading)
        /// </summary>
        /// <param name="agencyId">ID của đại lý</param>
        /// <param name="parentId">ID của location cha (0 = lấy tỉnh/thành phố, >0 = lấy con của location đó)</param>
        /// <returns>Danh sách location dưới dạng cây hierarchical, chỉ lấy location có type Urban hoặc SubUrban</returns>
        [HttpGet("GetAvailableLocationsTree")]
        [Authorize(Roles = "AgencyLocation.GetAvailableLocationsTree")]
        public async Task<IActionResult> GetAvailableLocationsTree(int agencyId, int parentId = 0)
        {
            if (agencyId <= 0)
            {
                return BadRequest("AgencyId không hợp lệ");
            }

            var result = await _agencyLocationService.GetAvailableLocationsTree(agencyId, parentId);
            return Ok(result);
        }
    }
}

