using Lada.Framework.DTO;
using Lada.Framework.DTO.SmartTable;
using Ladaer.BackEnd.Infrastructures.DTO.Results.Finance;
using Ladaer.BackEnd.Infrastructures.Services.Finances;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;

namespace Ladaer.BackEnd.Controllers.Finance
{
    /// <summary>
    /// Controller quản lý hóa đơn VAT từ Tổng cục Thuế
    /// </summary>
    [ApiController]
    [Route("api/[controller]")]
    [Authorize]
    public class VatInvoiceController : ControllerBase
    {
        private readonly IVatInvoiceService _vatInvoiceService;
        private readonly IVatInvoiceSyncService _vatInvoiceSyncService;

        public VatInvoiceController(IVatInvoiceService vatInvoiceService, IVatInvoiceSyncService vatInvoiceSyncService)
        {
            _vatInvoiceService = vatInvoiceService;
            _vatInvoiceSyncService = vatInvoiceSyncService;
        }

        /// <summary>
        /// Tìm kiếm hóa đơn VAT
        /// </summary>
        /// <param name="param">Tham số tìm kiếm</param>
        /// <returns>Danh sách hóa đơn VAT</returns>
        [HttpPost("Search")]
        [Authorize(Roles = "VatInvoice.Search")]
        public async Task<IActionResult> Search([FromBody] SmartTableParam param)
        {
            var result = await _vatInvoiceService.Search(param);
            return Ok(result);
        }

        /// <summary>
        /// Đồng bộ thủ công hóa đơn bán ra từ API Tổng cục Thuế
        /// </summary>
        /// <param name="request">Khoảng thời gian cần đồng bộ</param>
        /// <returns>Kết quả đồng bộ</returns>
        [HttpPost("SyncManual")]
        [Authorize(Roles = "VatInvoice.Sync")]
        public async Task<IActionResult> SyncManual([FromBody] DateRangeRequest request)
        {
            if (request.FromDate > request.ToDate)
            {
                return BadRequest(new BaseResult
                {
                    Result = Result.Failed,
                    Message = "Ngày bắt đầu phải nhỏ hơn hoặc bằng ngày kết thúc"
                });
            }

            var invoiceDirection = request.InvoiceDirection ?? 1;
            var result = await _vatInvoiceSyncService.SyncInvoicesFromAPI(request.FromDate, request.ToDate, invoiceDirection: invoiceDirection);
            return Ok(result);
        }

        /// <summary>
        /// Lấy thông tin đồng bộ gần nhất
        /// </summary>
        /// <returns>Thông tin đồng bộ gần nhất</returns>
        [HttpGet("GetLastSyncInfo")]
        [Authorize(Roles = "VatInvoice.Search")]
        public async Task<IActionResult> GetLastSyncInfo()
        {
            var result = await _vatInvoiceSyncService.GetLastSyncInfo();
            return Ok(result);
        }

        /// <summary>
        /// Model cho request đồng bộ thủ công
        /// </summary>
        public class DateRangeRequest
        {
            public DateTimeOffset FromDate { get; set; }
            public DateTimeOffset ToDate { get; set; }
            /// <summary>
            /// Chiều hóa đơn: 1 = Bán ra (Sold), 2 = Mua vào (Purchase). Mặc định là 1.
            /// </summary>
            public int? InvoiceDirection { get; set; }
        }
    }
}
