using System.ComponentModel.DataAnnotations;
using Lada.Framework.Data.Domains.BaseEntities;
using Lada.Framework.Data.Domains.Finance;
using Lada.Framework.Data.Domains.Identity;
using Lada.Framework.Data.Enums;

namespace Lada.Framework.Data.Domains.Trucks;

/// <summary>
/// Chi tiết đổ dầu - Mở rộng TruckActivity với thông tin chi tiết về đổ dầu,
/// bao gồm ODO, số lít, đơn giá và tính toán định mức khoán.
/// </summary>
public class FuelRefill : BaseEntityWithKey<int>
{
    /// <summary>
    /// ID xe tải
    /// </summary>
    public int TruckId { get; set; }

    /// <summary>
    /// ID lái xe thực hiện đổ dầu
    /// </summary>
    public int DriverId { get; set; }

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

    #region Thông tin ODO

    /// <summary>
    /// ODO lần đổ dầu trước (hoặc ODO nhận xe nếu là lần đầu)
    /// </summary>
    public int PreviousOdo { get; set; }

    /// <summary>
    /// ODO hiện tại khi đổ dầu
    /// </summary>
    public int CurrentOdo { get; set; }

    /// <summary>
    /// Số km đã chạy = CurrentOdo - PreviousOdo
    /// </summary>
    public int DistanceKm { get; set; }

    #endregion

    #region Thông tin đổ dầu thực tế

    /// <summary>
    /// Số tiền đổ dầu (VD: 500,000 VND)
    /// </summary>
    public decimal Amount { get; set; }

    /// <summary>
    /// Đơn giá dầu (VD: 20,000 VND/lít)
    /// </summary>
    public decimal UnitPrice { get; set; }

    /// <summary>
    /// Số lít thực tế = Amount / UnitPrice (VD: 25 lít)
    /// </summary>
    public decimal ActualLiters { get; set; }

    #endregion

    #region Thông tin định mức khoán

    /// <summary>
    /// Định mức khoán của xe tại thời điểm đổ (copy từ Truck.FuelQuotaPer100Km)
    /// Lưu lại để tránh thay đổi khi sửa định mức xe
    /// </summary>
    public decimal FuelQuotaPer100Km { get; set; }

    /// <summary>
    /// Số lít được hưởng (khoán) = (DistanceKm * FuelQuotaPer100Km) / 100
    /// </summary>
    public decimal QuotaLiters { get; set; }

    /// <summary>
    /// Chênh lệch = QuotaLiters - ActualLiters
    /// + là lái xe được hưởng (đổ ít hơn định mức)
    /// - là lái xe phải bù (đổ nhiều hơn định mức)
    /// </summary>
    public decimal DifferenceLiters { get; set; }

    #endregion

    #region Thông tin khác

    /// <summary>
    /// Phương thức thanh toán
    /// </summary>
    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>
    public DateTimeOffset RefillTime { get; set; }

    /// <summary>
    /// ID giao dịch thẻ tín dụng (nếu đã đối soát)
    /// </summary>
    public Guid? FuelCardTransactionId { get; set; }

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

    #endregion

    #region Navigation Properties

    /// <summary>
    /// Xe tải
    /// </summary>
    public virtual Truck Truck { get; set; } = null!;

    /// <summary>
    /// Lái xe
    /// </summary>
    public virtual User Driver { get; set; } = null!;

    /// <summary>
    /// Thẻ xăng dầu (nếu có)
    /// </summary>
    public virtual FuelCard? FuelCard { get; set; }

    /// <summary>
    /// Giao dịch thẻ tín dụng liên kết (nếu đã đối soát)
    /// </summary>
    public virtual FuelCardTransaction? FuelCardTransaction { get; set; }

    /// <summary>
    /// Danh sách media (ảnh ODO, cây dầu, hóa đơn)
    /// </summary>
    public virtual ICollection<FuelRefillMedia> FuelRefillMedias { get; set; } = new List<FuelRefillMedia>();

    #endregion
}
