using Lada.Framework.Data.Domains.Identity;
using Lada.Framework.DTO;
using Lada.Framework.DTO.SmartTable;
using Lada.Framework.Infrastructures.Helpers;
using Ladaer.BackEnd.Infrastructures.DTO.Models.Crm;
using Ladaer.BackEnd.Infrastructures.DTO.Results.Crm;
using Ladaer.BackEnd.Infrastructures.Services.Crm;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using System.Threading.Tasks;

namespace Ladaer.BackEnd.Controllers.Crm
{
    /// <summary>
    /// Controller quản lý thông tin xuất hóa đơn VAT của khách hàng
    /// </summary>
    [ApiController]
    [Route("api/[controller]")]
    [Authorize]
    public class VatInfoController : ControllerBase
    {
        private readonly IVatInfoService _vatInfoService;

        public VatInfoController(IVatInfoService vatInfoService)
        {
            _vatInfoService = vatInfoService;
        }

        /// <summary>
        /// Lấy danh sách thông tin xuất hóa đơn VAT
        /// </summary>
        /// <param name="searchModel">Model tìm kiếm</param>
        /// <returns>Danh sách thông tin xuất hóa đơn VAT</returns>
        [HttpPost("Search")]
        [Authorize(Roles = "VatInfo.Search")]
        public async Task<ActionResult> Search([FromBody] SmartTableParam param)
        {
            var result = await _vatInfoService.Search(param);
            return Ok(result);
        }

        /// <summary>
        /// Lấy thông tin chi tiết xuất hóa đơn VAT theo ID
        /// </summary>
        /// <param name="id">ID thông tin xuất hóa đơn VAT</param>
        /// <returns>Thông tin chi tiết xuất hóa đơn VAT</returns>
        [HttpGet("GetById")]
        [Authorize(Roles = "VatInfo.GetById")]
        public async Task<ActionResult> GetById(int id)
        {
            var result = await _vatInfoService.GetByIdAsync(id);
            return Ok(result);
        }

        /// <summary>
        /// Lấy thông tin xuất hóa đơn VAT mặc định của khách hàng
        /// </summary>
        /// <param name="customerId">ID khách hàng</param>
        /// <returns>Thông tin xuất hóa đơn VAT mặc định</returns>
        [HttpGet("GetDefaultByCustomerId")]
        [Authorize(Roles = "VatInfo.GetDefaultByCustomerId")]
        public async Task<ActionResult> GetDefaultByCustomerId(int customerId)
        {
            var result = await _vatInfoService.GetDefaultByCustomerIdAsync(customerId);
            return Ok(result);
        }

        /// <summary>
        /// Tạo mới hoặc cập nhật thông tin xuất hóa đơn VAT
        /// </summary>
        /// <param name="model">Model tạo mới hoặc cập nhật</param>
        /// <returns>Kết quả tạo mới hoặc cập nhật</returns>
        [HttpPost("CreateOrUpdate")]
        [Authorize(Roles = "VatInfo.CreateOrUpdate")]
        public async Task<ActionResult<VatInfoResult>> CreateOrUpdate([FromBody] VatInfoModel model)
        {
            var result = new VatInfoResult();
            if (!ModelState.IsValid)
            {
                result.Result = Result.Failed;
                result.Message = "Yêu cầu không hợp lệ";
                return Ok(result);
            }

            // Lấy thông tin người tạo/cập nhật từ token
            var currentUser = User.GetCurrentUser();
            if (currentUser == null)
            {
                result.Result = Result.Failed;
                result.Message = "Không xác định được người dùng";
                return Ok(result);
            }
            result = await _vatInfoService.CreateOrUpdateAsync(model);
            return Ok(result);
        }

        /// <summary>
        /// Xóa thông tin xuất hóa đơn VAT
        /// </summary>
        /// <param name="id">ID thông tin xuất hóa đơn VAT</param>
        /// <returns>Kết quả xóa</returns>
        [HttpDelete("Delete")]
        [Authorize(Roles = "VatInfo.Delete")]
        public async Task<ActionResult> Delete(int id)
        {
            var result = await _vatInfoService.DeleteAsync(id);
            return Ok(result);
        }

        /// <summary>
        /// Đặt thông tin xuất hóa đơn VAT làm mặc định
        /// </summary>
        /// <param name="id">ID thông tin xuất hóa đơn VAT</param>
        /// <returns>Kết quả cập nhật</returns>
        [HttpPut("SetAsDefault")]
        [Authorize(Roles = "VatInfo.SetAsDefault")]
        public async Task<ActionResult<BaseResult>> SetAsDefault(int id)
        {
            var result = new BaseResult();
            // Lấy thông tin người tạo/cập nhật từ token
            var currentUser = User.GetCurrentUser();
            if (currentUser == null)
            {
                result.Result = Result.Failed;
                result.Message = "Không xác định được người dùng";
                return Ok(result);
            }

            result = await _vatInfoService.SetAsDefaultAsync(id, currentUser);
            return Ok(result);
        }

    }
}