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

namespace Lada.Framework.Data.Domains.Trucks
{
    /// <summary>
    /// Biểu diễn một xe tải được quản lý trong hệ thống cùng với thông tin vận hành của nó.
    /// </summary>
    public class Truck : BaseEntityWithKey<int>
    {
        /// <summary>
        /// Biển số xe của xe tải, phải là duy nhất.
        /// </summary>
        [Required]
        [StringLength(20)]
        public string LicensePlate { get; set; }

        /// <summary>
        /// Thương hiệu xe tải (ví dụ: "Kia", "Hyundai", "Isuzu").
        /// </summary>
        [StringLength(50)]
        public string? Brand { get; set; }

        /// <summary>
        /// Model xe tải (ví dụ: "K200", "Porter", "D-Max").
        /// </summary>
        [StringLength(50)]
        public string? Model { get; set; }

        /// <summary>
        /// Khóa ngoại tham chiếu đến chi nhánh mà xe tải này thuộc về.
        /// </summary>
        [ForeignKey("Agency")]
        public int AgencyId { get; set; }

        /// <summary>
        /// Loại xe tải (ví dụ: "Xe tải nhẹ", "Xe container").
        /// </summary>
        //[StringLength(50)]
        //public string Type { get; set; }

        /// <summary>
        /// Tải trọng tối đa cho phép của xe tải, tính bằng tấn.
        /// </summary>
        public decimal MaxPayload { get; set; }

        /// <summary>
        /// Chiều dài khu vực chứa hàng của xe tải, tính bằng cm.
        /// </summary>
        public int CargoLength { get; set; }

        /// <summary>
        /// Chiều rộng khu vực chứa hàng của xe tải, tính bằng cm.
        /// </summary>
        public int CargoWidth { get; set; }

        /// <summary>
        /// Chiều cao khu vực chứa hàng của xe tải, tính bằng cm.
        /// </summary>
        public int CargoHeight { get; set; }

        /// <summary>
        /// Trạng thái vận hành hiện tại của xe tải ("Running" - Đang chạy, "Parked" - Đang dừng đỗ).
        /// </summary>
        public OperatingStatus OperatingStatus { get; set; } = OperatingStatus.Stop;

        public TruckStatus Status { get; set; } = TruckStatus.Normal;

        /// <summary>
        /// Khóa ngoại tham chiếu đến tài xế hiện đang phụ trách xe này, có thể null.
        /// </summary>

        public int CurrentDriverId { get; set; }

        /// <summary>
        /// Năm sản xuất của xe tải.
        /// </summary>
        public int ManufacturingYear { get; set; }

        /// <summary>
        /// Thông tin đăng kiểm của xe tải (ví dụ: chi tiết giấy chứng nhận đăng kiểm).
        /// </summary>
        [StringLength(200)]
        public string? RegistrationInfo { get; set; }

        /// <summary>
        /// Định mức khoán xăng dầu (lít/100km).
        /// Ví dụ: 11 lít => xe chạy 100km được công ty trả 11 lít dầu.
        /// </summary>
        public decimal FuelQuotaPer100Km { get; set; } = 0;

        /// <summary>
        /// Giá trị ODO gần nhất khi đổ dầu.
        /// Dùng để tính số km đã chạy cho lần đổ dầu tiếp theo.
        /// </summary>
        public int? LastRefillOdo { get; set; }

        /// <summary>
        /// Chi nhánh mà xe tải này thuộc về.
        /// </summary>
        public virtual Agency Agency { get; set; }

        
        /// <summary>
        /// Danh sách các hoạt động của xe tải này.
        /// </summary>
        public virtual ICollection<TruckActivity> TruckActivities { get; set; } = new List<TruckActivity>();

        /// <summary>
        /// Danh sách media (ảnh đăng ký, đăng kiểm)
        /// </summary>
        public virtual ICollection<TruckMedia> TruckMedias { get; set; } = new List<TruckMedia>();


        //[MaxLength(10)]
        //public string LicensePlate { get; set; }
        //public int AgencyId { get; set; }
        //public TruckStatus Status { get; set; }
        //public int PicId { get; set; }
        //public DateTimeOffset LastRepairDate { get; set; }
    }
}
