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

namespace Lada.Framework.Data.Domains.Premises
{
    /// <summary>
    /// Mặt bằng bưu cục - Aggregate Root
    /// Thông số đặc tả (được chấm điểm) được lưu trong PremiseScore
    /// </summary>
    public class Premise : BaseEntityWithKey<int>
    {
        /// <summary>
        /// Mã mặt bằng (tự sinh hoặc nhập tay)
        /// </summary>
        [MaxLength(50)]
        public string Code { get; set; } = string.Empty;

        /// <summary>
        /// Trạng thái quy trình
        /// </summary>
        public PremiseStatus Status { get; set; } = PremiseStatus.Surveying;

        #region Liên kết hệ thống

        /// <summary>
        /// Bưu cục liên kết (FK → Agency)
        /// </summary>
        public int AgencyId { get; set; }

        /// <summary>
        /// Tỉnh / Thành phố (FK → Location, Level = 1)
        /// </summary>
        public int CityId { get; set; }

        /// <summary>
        /// Quận / Huyện (FK → Location, Level = 2)
        /// </summary>
        public int DistrictId { get; set; }

        /// <summary>
        /// Phường / Xã (FK → Location, Level = 3)
        /// </summary>
        public int WardId { get; set; }

        #endregion

        #region Định vị chi tiết

        /// <summary>
        /// Địa chỉ chi tiết (số nhà, tên đường)
        /// </summary>
        [MaxLength(500)]
        public string AddressDetail { get; set; } = string.Empty;

        /// <summary>
        /// Vĩ độ
        /// </summary>
        public double? Latitude { get; set; }

        /// <summary>
        /// Kinh độ
        /// </summary>
        public double? Longitude { get; set; }

        /// <summary>
        /// Link Google Maps
        /// </summary>
        [MaxLength(1000)]
        public string? GoogleMapUrl { get; set; }

        #endregion

        #region Tổng điểm

        /// <summary>
        /// Tổng điểm mặt bằng (tính từ tổng PremiseScore)
        /// Được tính lại khi có thay đổi điểm
        /// </summary>
        public int TotalScore { get; set; }

        #endregion

        #region Ghi chú chung

        /// <summary>
        /// Mô tả / ghi chú tổng quan
        /// </summary>
        [MaxLength(4000)]
        public string? Description { get; set; }

        #endregion

        #region Navigation Properties

        public virtual Agency Agency { get; set; } = null!;
        public virtual Location City { get; set; } = null!;
        public virtual Location District { get; set; } = null!;
        public virtual Location Ward { get; set; } = null!;

        public virtual PremiseFinancial? Financial { get; set; }
        public virtual ICollection<PremiseContact> Contacts { get; set; } = new List<PremiseContact>();
        public virtual ICollection<PremiseScore> Scores { get; set; } = new List<PremiseScore>();
        public virtual ICollection<PremiseMedia> PremiseMedias { get; set; } = new List<PremiseMedia>();

        #endregion
    }
}
