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

namespace Ladaer.BackEnd.Controllers.Finance;

/// <summary>
/// Controller quản lý thẻ xăng dầu (thẻ tín dụng), đổ dầu và thanh toán tiền dầu khoán
/// </summary>
[Route("api/[controller]")]
[ApiController]
[Authorize]
public class FuelCardController : ControllerBase
{
    private readonly IFuelCardService _fuelCardService;
    private readonly IFuelCardTransactionService _fuelCardTransactionService;
    private readonly IFuelRefillService _fuelRefillService;
    private readonly IFuelRefillExcelService _fuelRefillExcelService;

    public FuelCardController(
        IFuelCardService fuelCardService,
        IFuelCardTransactionService fuelCardTransactionService,
        IFuelRefillService fuelRefillService,
        IFuelRefillExcelService fuelRefillExcelService)
    {
        _fuelCardService = fuelCardService;
        _fuelCardTransactionService = fuelCardTransactionService;
        _fuelRefillService = fuelRefillService;
        _fuelRefillExcelService = fuelRefillExcelService;
    }

    #region FuelCard Management

    /// <summary>
    /// Tìm kiếm thẻ xăng dầu với phân trang
    /// </summary>
    [HttpPost("Search")]
    [Authorize(Roles = "FuelCard.Search")]
    public async Task<IActionResult> Search([FromBody] SmartTableParam param)
    {
        try
        {
            var result = await _fuelCardService.Search(param);
            return Ok(result);
        }
        catch (Exception ex)
        {
            return StatusCode(500, $"Lỗi hệ thống: {ex.Message}");
        }
    }

    /// <summary>
    /// Lấy thông tin thẻ xăng dầu theo ID
    /// </summary>
    [HttpGet("GetById/{id}")]
    [Authorize(Roles = "FuelCard.GetById")]
    public async Task<IActionResult> GetById(int id)
    {
        if (id <= 0) return BadRequest("ID không hợp lệ");

        try
        {
            var result = await _fuelCardService.GetByIdAsync(id);
            if (result == null) return NotFound("Không tìm thấy thẻ xăng dầu");
            return Ok(result);
        }
        catch (Exception ex)
        {
            return StatusCode(500, $"Lỗi hệ thống: {ex.Message}");
        }
    }

    /// <summary>
    /// Tạo hoặc cập nhật thẻ xăng dầu
    /// </summary>
    [HttpPost("CreateOrUpdate")]
    [Authorize(Roles = "FuelCard.CreateOrUpdate")]
    public async Task<IActionResult> CreateOrUpdate([FromBody] FuelCardModel model)
    {
        if (!ModelState.IsValid) return BadRequest(ModelState);

        try
        {
            var currentUser = User.GetCurrentUser();
            var result = await _fuelCardService.CreateOrUpdateAsync(model, currentUser);
            return Ok(result);
        }
        catch (Exception ex)
        {
            return StatusCode(500, $"Lỗi hệ thống: {ex.Message}");
        }
    }

    /// <summary>
    /// Xóa thẻ xăng dầu
    /// </summary>
    [HttpPost("Delete/{id}")]
    [Authorize(Roles = "FuelCard.Delete")]
    public async Task<IActionResult> Delete(int id)
    {
        if (id <= 0) return BadRequest("ID không hợp lệ");

        try
        {
            var currentUser = User.GetCurrentUser();
            var result = await _fuelCardService.DeleteAsync(id, currentUser);
            return Ok(result);
        }
        catch (Exception ex)
        {
            return StatusCode(500, $"Lỗi hệ thống: {ex.Message}");
        }
    }

    /// <summary>
    /// Lấy danh sách thẻ đang hoạt động
    /// </summary>
    [HttpGet("GetActiveCards")]
    [Authorize(Roles = "FuelCard.GetActiveCards")]
    public async Task<IActionResult> GetActiveCards()
    {
        try
        {
            var result = await _fuelCardService.GetActiveCardsAsync();
            return Ok(result);
        }
        catch (Exception ex)
        {
            return StatusCode(500, $"Lỗi hệ thống: {ex.Message}");
        }
    }

    /// <summary>
    /// Lấy tổng nợ thẻ tín dụng (cho báo cáo)
    /// </summary>
    [HttpGet("GetTotalDebt")]
    [Authorize(Roles = "FuelCard.GetTotalDebt")]
    public async Task<IActionResult> GetTotalDebt()
    {
        try
        {
            var totalDebt = await _fuelCardService.GetTotalDebtAsync();
            return Ok(new { TotalDebt = totalDebt });
        }
        catch (Exception ex)
        {
            return StatusCode(500, $"Lỗi hệ thống: {ex.Message}");
        }
    }

    #endregion

    #region FuelCardTransaction Management

    /// <summary>
    /// Import sao kê thẻ tín dụng từ Excel
    /// </summary>
    [HttpPost("ImportStatement")]
    [Authorize(Roles = "FuelCard.ImportStatement")]
    public async Task<IActionResult> ImportStatement([FromForm] FuelCardTransactionImportModel model)
    {
        if (!ModelState.IsValid) return BadRequest(ModelState);

        try
        {
            var currentUser = User.GetCurrentUser();
            var result = await _fuelCardTransactionService.ImportStatementAsync(model, currentUser);
            return Ok(result);
        }
        catch (Exception ex)
        {
            return StatusCode(500, $"Lỗi hệ thống: {ex.Message}");
        }
    }

    /// <summary>
    /// Import lịch sử giao dịch thẻ xăng dầu từ file Excel.
    /// File Excel phải có cột "Tài khoản thẻ/ Số thẻ" để hệ thống ánh xạ với thẻ tương ứng.
    /// Hệ thống sẽ tự động tìm thẻ dựa vào số thẻ trong file và tạo giao dịch tương ứng.
    /// </summary>
    /// <remarks>
    /// Các cột được hỗ trợ trong file Excel:
    /// - Tài khoản thẻ / Số thẻ (bắt buộc): Số thẻ tín dụng để mapping
    /// - Ngày giao dịch: Định dạng dd/MM/yyyy hoặc dd/MM/yyyy HH:mm
    /// - Số tiền: Số tiền giao dịch (hỗ trợ định dạng 1.234.567 hoặc 1,234,567)
    /// - Loại tiền: VND, USD...
    /// - Loại giao dịch: Retail, Refund...
    /// - Địa điểm: Nơi giao dịch
    /// - Tình trạng: Thành công, Chờ xử lý...
    /// </remarks>
    [HttpPost("ImportTransactionHistory")]
    [Authorize(Roles = "FuelCard.ImportTransactionHistory")]
    public async Task<IActionResult> ImportTransactionHistory([FromForm] FuelCardTransactionHistoryImportModel model)
    {
        if (!ModelState.IsValid) return BadRequest(ModelState);

        try
        {
            var currentUser = User.GetCurrentUser();
            var result = await _fuelCardTransactionService.ImportTransactionHistoryAsync(model, currentUser);

            if (result.Result == Lada.Framework.DTO.Result.Success)
            {
                return Ok(result);
            }
            else
            {
                return BadRequest(result);
            }
        }
        catch (Exception ex)
        {
            return StatusCode(500, new FuelCardTransactionImportResult
            {
                Result = Lada.Framework.DTO.Result.SystemError,
                Message = $"Lỗi hệ thống: {ex.Message}"
            });
        }
    }

    /// <summary>
    /// Tìm kiếm giao dịch thẻ
    /// </summary>
    [HttpPost("SearchTransactions")]
    [Authorize(Roles = "FuelCard.SearchTransactions")]
    public async Task<IActionResult> SearchTransactions([FromBody] SmartTableParam param, [FromQuery] int? fuelCardId = null)
    {
        try
        {
            var result = await _fuelCardTransactionService.Search(param, fuelCardId);
            return Ok(result);
        }
        catch (Exception ex)
        {
            return StatusCode(500, $"Lỗi hệ thống: {ex.Message}");
        }
    }

    /// <summary>
    /// Lấy chi tiết giao dịch thẻ
    /// </summary>
    [HttpGet("GetTransactionById/{id}")]
    [Authorize(Roles = "FuelCard.GetTransactionById")]
    public async Task<IActionResult> GetTransactionById(Guid id)
    {
        try
        {
            var result = await _fuelCardTransactionService.GetByIdAsync(id);
            if (result == null) return NotFound("Không tìm thấy giao dịch");
            return Ok(result);
        }
        catch (Exception ex)
        {
            return StatusCode(500, $"Lỗi hệ thống: {ex.Message}");
        }
    }

    /// <summary>
    /// Đối soát giao dịch thẻ với lần đổ dầu
    /// </summary>
    [HttpPost("ReconcileTransaction")]
    [Authorize(Roles = "FuelCard.ReconcileTransaction")]
    public async Task<IActionResult> ReconcileTransaction([FromQuery] Guid transactionId, [FromQuery] int fuelRefillId)
    {
        try
        {
            var currentUser = User.GetCurrentUser();
            var result = await _fuelCardTransactionService.ReconcileWithRefillAsync(transactionId, fuelRefillId, currentUser);
            return Ok(result);
        }
        catch (Exception ex)
        {
            return StatusCode(500, $"Lỗi hệ thống: {ex.Message}");
        }
    }

    /// <summary>
    /// Đánh dấu giao dịch đã thanh toán cho ngân hàng
    /// </summary>
    [HttpPost("MarkTransactionPaid/{id}")]
    [Authorize(Roles = "FuelCard.MarkTransactionPaid")]
    public async Task<IActionResult> MarkTransactionPaid(Guid id)
    {
        try
        {
            var currentUser = User.GetCurrentUser();
            var result = await _fuelCardTransactionService.MarkAsPaidToBankAsync(id, currentUser);
            return Ok(result);
        }
        catch (Exception ex)
        {
            return StatusCode(500, $"Lỗi hệ thống: {ex.Message}");
        }
    }

    /// <summary>
    /// Lấy danh sách giao dịch chưa đối soát theo thẻ và ngày
    /// </summary>
    [HttpGet("GetUnreconciledTransactions")]
    [Authorize(Roles = "FuelCard.GetUnreconciledTransactions")]
    public async Task<IActionResult> GetUnreconciledTransactions([FromQuery] int fuelCardId, [FromQuery] DateTimeOffset date)
    {
        if (fuelCardId <= 0) return BadRequest("FuelCardId không hợp lệ");

        try
        {
            var result = await _fuelCardTransactionService.GetUnreconciledTransactionsByCardAndDateAsync(fuelCardId, date);
            return Ok(result);
        }
        catch (Exception ex)
        {
            return StatusCode(500, $"Lỗi hệ thống: {ex.Message}");
        }
    }

    #endregion

    #region FuelRefill Management

    /// <summary>
    /// Tạo hoặc cập nhật thông tin đổ dầu
    /// </summary>
    [HttpPost("CreateOrUpdateRefill")]
    [Authorize(Roles = "FuelCard.CreateOrUpdateRefill")]
    public async Task<IActionResult> CreateOrUpdateRefill([FromForm] FuelRefillModel model)
    {
        if (!ModelState.IsValid) return BadRequest(ModelState);

        try
        {
            var currentUser = User.GetCurrentUser();
            var result = await _fuelRefillService.CreateOrUpdate(model, currentUser);
            return Ok(result);
        }
        catch (Exception ex)
        {
            return StatusCode(500, $"Lỗi hệ thống: {ex.Message}");
        }
    }



    /// <summary>
    /// Tìm kiếm lịch sử đổ dầu
    /// </summary>
    [HttpPost("SearchRefills")]
    [Authorize(Roles = "FuelCard.SearchRefills")]
    public async Task<IActionResult> SearchRefills([FromBody] SmartTableParam param)
    {
        try
        {
            var result = await _fuelRefillService.Search(param);
            return Ok(result);
        }
        catch (Exception ex)
        {
            return StatusCode(500, $"Lỗi hệ thống: {ex.Message}");
        }
    }

    /// <summary>
    /// Lấy chi tiết lần đổ dầu
    /// </summary>
    [HttpGet("GetRefillById/{id}")]
    [Authorize(Roles = "FuelCard.GetRefillById")]
    public async Task<IActionResult> GetRefillById(int id)
    {
        if (id <= 0) return BadRequest("ID không hợp lệ");

        try
        {
            var result = await _fuelRefillService.GetByIdAsync(id);
            if (result == null) return NotFound("Không tìm thấy lần đổ dầu");
            return Ok(result);
        }
        catch (Exception ex)
        {
            return StatusCode(500, $"Lỗi hệ thống: {ex.Message}");
        }
    }

    /// <summary>
    /// Lấy lịch sử đổ dầu theo xe
    /// </summary>
    [HttpGet("GetRefillsByTruck/{truckId}")]
    [Authorize(Roles = "FuelCard.GetRefillsByTruck")]
    public async Task<IActionResult> GetRefillsByTruck(int truckId)
    {
        if (truckId <= 0) return BadRequest("ID không hợp lệ");

        try
        {
            var result = await _fuelRefillService.GetByTruckAsync(truckId);
            return Ok(result);
        }
        catch (Exception ex)
        {
            return StatusCode(500, $"Lỗi hệ thống: {ex.Message}");
        }
    }

    /// <summary>
    /// Lấy lịch sử đổ dầu theo lái xe
    /// </summary>
    [HttpGet("GetRefillsByDriver/{driverId}")]
    [Authorize(Roles = "FuelCard.GetRefillsByDriver")]
    public async Task<IActionResult> GetRefillsByDriver(int driverId)
    {
        if (driverId <= 0) return BadRequest("ID không hợp lệ");

        try
        {
            var result = await _fuelRefillService.GetByDriverAsync(driverId);
            return Ok(result);
        }
        catch (Exception ex)
        {
            return StatusCode(500, $"Lỗi hệ thống: {ex.Message}");
        }
    }



    /// <summary>
    /// Xóa bản ghi đổ dầu
    /// </summary>
    [HttpPost("DeleteRefill/{id}")]
    [Authorize(Roles = "FuelCard.DeleteRefill")]
    public async Task<IActionResult> DeleteRefill(int id)
    {
        if (id <= 0) return BadRequest("ID không hợp lệ");

        try
        {
            var currentUser = User.GetCurrentUser();
            var result = await _fuelRefillService.DeleteAsync(id, currentUser);
            return Ok(result);
        }
        catch (Exception ex)
        {
            return StatusCode(500, $"Lỗi hệ thống: {ex.Message}");
        }
    }

    /// <summary>
    /// Xuất Excel lịch sử đổ dầu
    /// </summary>
    [HttpPost("ExportRefillsExcel")]
    [Authorize(Roles = "FuelCard.ExportExcel")]
    public async Task<IActionResult> ExportRefillsExcel([FromBody] SmartTableParam param)
    {
        try
        {
            var result = await _fuelRefillExcelService.ExportFuelRefillsAsync(param);

            // Tạo download URL nếu chưa có
            if (result.Result == Lada.Framework.DTO.Result.Success && string.IsNullOrEmpty(result.DownloadUrl) && !string.IsNullOrEmpty(result.FilePath))
            {
                var fileName = Path.GetFileName(result.FilePath);
                result.DownloadUrl = $"/api/FuelCardExcelExport/Download/{fileName}";
            }

            if (result.Result == Lada.Framework.DTO.Result.Success)
            {
                return Ok(result);
            }
            else
            {
                return BadRequest(result);
            }
        }
        catch (Exception ex)
        {
            return StatusCode(500, new Ladaer.BackEnd.Infrastructures.DTO.Results.FuelCards.FuelRefillExcelExportResult
            {
                Result = Lada.Framework.DTO.Result.SystemError,
                Message = $"Lỗi hệ thống: {ex.Message}"
            });
        }
    }

    #endregion
}
