using System.ComponentModel.DataAnnotations;
using Lada.Framework.Data.Enums;
using Lada.Framework.DTO;
using Microsoft.AspNetCore.Http;

namespace Ladaer.BackEnd.Infrastructures.DTO.Models.FuelCards;

/// <summary>
/// Model đổ dầu - Lái xe gửi thông tin đổ dầu với hình ảnh
/// </summary>
public class FuelRefillModel : BaseModel<int>
{
    /// <summary>
    /// ID xe tải (tự động lấy từ xe hiện tại của lái xe)
    /// </summary>
    public int TruckId { get; set; }

    /// <summary>
    /// ID thẻ xăng dầu (nullable - có thể trả tiền mặt)
    /// </summary>
    public int? FuelCardId { get; set; }

    /// <summary>
    /// ID lái xe thực hiện đổ dầu (nullable - mặc định là người dùng hiện tại)
    /// </summary>
    public int? DriverId { get; set; }

    /// <summary>
    /// ID giao dịch thẻ tín dụng cần đối soát (nullable)
    /// Nếu có, hệ thống sẽ tự động liên kết giao dịch với lần đổ dầu
    /// </summary>
    public Guid? FuelCardTransactionId { get; set; }

    /// <summary>
    /// ODO hiện tại khi đổ dầu
    /// </summary>
    [Required(ErrorMessage = "Số ODO hiện tại là bắt buộc")]
    [Range(0, int.MaxValue, ErrorMessage = "Số ODO phải lớn hơn hoặc bằng 0")]
    public int CurrentOdo { get; set; }

    /// <summary>
    /// ODO trước đó (bắt buộc)
    /// </summary>
    [Required(ErrorMessage = "Số ODO trước đó là bắt buộc")]
    [Range(0, int.MaxValue, ErrorMessage = "Số ODO trước đó phải lớn hơn hoặc bằng 0")]
    public int PreviousOdo { get; set; }

    /// <summary>
    /// Số tiền đổ dầu
    /// </summary>
    [Required(ErrorMessage = "Số tiền đổ dầu là bắt buộc")]
    [Range(0, double.MaxValue, ErrorMessage = "Số tiền phải lớn hơn 0")]
    public decimal Amount { get; set; }

    /// <summary>
    /// Đơn giá dầu (VND/lít)
    /// </summary>
    [Required(ErrorMessage = "Đơn giá dầu là bắt buộc")]
    [Range(0, double.MaxValue, ErrorMessage = "Đơn giá phải lớn hơn 0")]
    public decimal UnitPrice { get; set; }

    /// <summary>
    /// Phương thức thanh toán
    /// </summary>
    [Required]
    public FuelRefillPaymentMethod PaymentMethod { get; set; } = FuelRefillPaymentMethod.Card;

    /// <summary>
    /// Tên cây xăng
    /// </summary>
    [MaxLength(256)]
    public string StationName { get; set; } = string.Empty;

    /// <summary>
    /// Địa chỉ cây xăng
    /// </summary>
    [MaxLength(512)]
    public string StationAddress { get; set; } = string.Empty;

    /// <summary>
    /// Thời gian đổ dầu
    /// </summary>
    [Required(ErrorMessage = "Thời gian đổ dầu là bắt buộc")]
    public DateTimeOffset RefillTime { get; set; }

    /// <summary>
    /// Ghi chú
    /// </summary>
    [MaxLength(1024)]
    public string Notes { get; set; } = string.Empty;

    /// <summary>
    /// Danh sách hình ảnh (ODO trước, ODO sau, cây dầu, hóa đơn)
    /// </summary>
    public List<IFormFile>? Files { get; set; } = new List<IFormFile>();

    /// <summary>
    /// Loại hình ảnh tương ứng (OdoBeforePhoto, OdoAfterPhoto, FuelPumpPhoto, FuelReceiptPhoto)
    /// Phải tương ứng 1-1 với Files
    /// </summary>
    public List<TruckActivityMediaType> MediaTypes { get; set; } = new List<TruckActivityMediaType>();

    /// <summary>
    /// Danh sách ID của media hiện có cần giữ lại khi update
    /// Dùng để tối ưu: chỉ upload ảnh mới, giữ lại ảnh cũ
    /// VD: [1, 2, 0, 4] nghĩa là giữ media ID 1,2,4 và upload ảnh mới cho vị trí thứ 3
    /// </summary>
    public List<int>? ExistingMediaIds { get; set; } = new List<int>();
}
