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

namespace Ladaer.BackEnd.Controllers.Finance
{
    [Route("api/[controller]")]
    [ApiController]
    [Authorize]
    public class TaxInvoiceController : ControllerBase
    {
        private readonly ITaxInvoiceService _service;
        private readonly ICustomerReconciliationSlipService _reconciliationService;

        public TaxInvoiceController(
            ITaxInvoiceService service,
            ICustomerReconciliationSlipService reconciliationService)
        {
            _service = service;
            _reconciliationService = reconciliationService;
        }

        /// <summary>
        /// Tạo hóa đơn thuế mới
        /// </summary>
        /// <param name="model">Thông tin tạo hóa đơn (CustomerReconciliationSlipId, VatInfoId, Note)</param>
        /// <returns>Kết quả tạo hóa đơn</returns>
        [HttpPost("Create")]
        [Authorize(Roles = "TaxInvoice.Create,Founder")]
        public async Task<IActionResult> Create([FromBody] CreateTaxInvoiceModel model)
        {
            var currentUser = User.GetCurrentUser();
            if (currentUser == null)
            {
                return Unauthorized();
            }

            if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }

            // Kiểm tra trạng thái phiếu đối soát
            var slip = await _reconciliationService.GetSlipByIdAsync(model.CustomerReconciliationSlipId, currentUser.UserId);
            if (slip == null || slip.Slip == null)
            {
                return NotFound("Không tìm thấy phiếu đối soát");
            }

            if (slip.Slip.Status == Lada.Framework.Data.Domains.Finance.CustomerReconciliationSlipStatus.Rejected)
            {
                return BadRequest("Không thể tạo hóa đơn thuế cho phiếu đối soát đã bị từ chối");
            }

            var result = await _service.CreateTaxInvoiceAsync(model, currentUser);

            if (result.Result == Result.Success)
            {
                return Ok(result);
            }
            else
            {
                return BadRequest(result);
            }
        }

        /// <summary>
        /// Cập nhật trạng thái hóa đơn thuế (Draft hoặc Issued)
        /// </summary>
        /// <param name="model">Thông tin cập nhật (TaxInvoiceId, Status, InvoiceNumber, InvoiceDate, Files)</param>
        /// <returns>Kết quả cập nhật</returns>
        [HttpPost("UpdateStatus")]
        [Authorize(Roles = "TaxInvoice.Update,Founder")]
        public async Task<IActionResult> UpdateStatus([FromForm] UpdateTaxInvoiceStatusModel model)
        {
            var currentUser = User.GetCurrentUser();
            if (currentUser == null)
            {
                return Unauthorized();
            }

            if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }

            // Lấy thông tin hóa đơn để kiểm tra phiếu đối soát
            var taxInvoice = await _service.GetTaxInvoiceByIdAsync(model.TaxInvoiceId, currentUser);
            if (taxInvoice == null || taxInvoice.CustomerReconciliationSlipId <= 0)
            {
                return NotFound("Không tìm thấy hóa đơn thuế");
            }

            // Kiểm tra trạng thái phiếu đối soát
            var slip = await _reconciliationService.GetSlipByIdAsync(taxInvoice.CustomerReconciliationSlipId, currentUser.UserId);
            if (slip == null || slip.Slip == null)
            {
                return NotFound("Không tìm thấy phiếu đối soát");
            }

            if (slip.Slip.Status == Lada.Framework.Data.Domains.Finance.CustomerReconciliationSlipStatus.Rejected)
            {
                return BadRequest("Không thể cập nhật hóa đơn thuế cho phiếu đối soát đã bị từ chối");
            }

            var result = await _service.UpdateTaxInvoiceStatusAsync(model, currentUser);

            if (result.Result == Result.Success)
            {
                return Ok(result);
            }
            else
            {
                return BadRequest(result);
            }
        }

        /// <summary>
        /// Lấy thông tin hóa đơn thuế theo ID
        /// </summary>
        /// <param name="id">ID hóa đơn thuế</param>
        /// <returns>Thông tin hóa đơn thuế</returns>
        [HttpGet("{id}")]
        [Authorize(Roles = "TaxInvoice.View,Founder")]
        public async Task<IActionResult> GetById(int id)
        {
            var currentUser = User.GetCurrentUser();
            if (currentUser == null)
            {
                return Unauthorized();
            }

            var taxInvoice = await _service.GetTaxInvoiceByIdAsync(id, currentUser);
            if (taxInvoice == null)
            {
                return NotFound("Không tìm thấy hóa đơn thuế");
            }

            // Kiểm tra trạng thái phiếu đối soát
            if (taxInvoice.CustomerReconciliationSlipId > 0)
            {
                var slip = await _reconciliationService.GetSlipByIdAsync(taxInvoice.CustomerReconciliationSlipId, currentUser.UserId);
                if (slip?.Slip?.Status == Lada.Framework.Data.Domains.Finance.CustomerReconciliationSlipStatus.Rejected)
                {
                    return BadRequest("Không thể xem hóa đơn thuế cho phiếu đối soát đã bị từ chối");
                }
            }

            return Ok(taxInvoice);
        }

        /// <summary>
        /// Lấy thông tin hóa đơn thuế theo ID phiếu đối soát
        /// </summary>
        /// <param name="slipId">ID phiếu đối soát</param>
        /// <returns>Thông tin hóa đơn thuế</returns>
        [HttpGet("BySlip/{slipId}")]
        [Authorize(Roles = "TaxInvoice.View,Founder")]
        public async Task<IActionResult> GetBySlipId(int slipId)
        {
            var currentUser = User.GetCurrentUser();
            if (currentUser == null)
            {
                return Unauthorized();
            }

            // Kiểm tra trạng thái phiếu đối soát
            var slip = await _reconciliationService.GetSlipByIdAsync(slipId, currentUser.UserId);
            if (slip == null || slip.Slip == null)
            {
                return NotFound("Không tìm thấy phiếu đối soát");
            }

            if (slip.Slip.Status == Lada.Framework.Data.Domains.Finance.CustomerReconciliationSlipStatus.Rejected)
            {
                return BadRequest("Không thể xem hóa đơn thuế cho phiếu đối soát đã bị từ chối");
            }

            var taxInvoice = await _service.GetTaxInvoiceBySlipIdAsync(slipId, currentUser);
            return Ok(taxInvoice);
        }

        /// <summary>
        /// Xóa hóa đơn thuế (chỉ cho phép xóa khi ở trạng thái NotIssued)
        /// </summary>
        /// <param name="id">ID hóa đơn thuế</param>
        /// <returns>Kết quả xóa</returns>
        [HttpDelete("{id}")]
        [Authorize(Roles = "TaxInvoice.Delete,Founder")]
        public async Task<IActionResult> Delete(int id)
        {
            var currentUser = User.GetCurrentUser();
            if (currentUser == null)
            {
                return Unauthorized();
            }

            var result = await _service.DeleteTaxInvoiceAsync(id, currentUser);

            if (result.Result == Result.Success)
            {
                return Ok(new { Message = result.Message });
            }
            else
            {
                return BadRequest(new { Message = result.Message });
            }
        }
    }
}
