using TakeoutSaaS.Domain.Common.Enums;
using TakeoutSaaS.Domain.Stores.Enums;
using TakeoutSaaS.Shared.Abstractions.Entities;

namespace TakeoutSaaS.Domain.Stores.Entities;

/// <summary>
/// 门店信息，承载营业配置与能力。
/// </summary>
public sealed class Store : MultiTenantEntityBase
{
    /// <summary>
    /// 所属商户标识。
    /// </summary>
    public long MerchantId { get; set; }

    /// <summary>
    /// 门店编码，便于扫码及外部对接。
    /// </summary>
    public string Code { get; set; } = string.Empty;

    /// <summary>
    /// 门店名称。
    /// </summary>
    public string Name { get; set; } = string.Empty;

    /// <summary>
    /// 联系电话。
    /// </summary>
    public string? Phone { get; set; }

    /// <summary>
    /// 门店负责人姓名。
    /// </summary>
    public string? ManagerName { get; set; }

    /// <summary>
    /// 门店营业执照号（主体不一致模式使用）。
    /// </summary>
    public string? BusinessLicenseNumber { get; set; }

    /// <summary>
    /// 门店法人（主体不一致模式使用）。
    /// </summary>
    public string? LegalRepresentative { get; set; }

    /// <summary>
    /// 门店注册地址（主体不一致模式使用）。
    /// </summary>
    public string? RegisteredAddress { get; set; }

    /// <summary>
    /// 门店营业执照图片地址（主体不一致模式使用）。
    /// </summary>
    public string? BusinessLicenseImageUrl { get; set; }

    /// <summary>
    /// 门头招牌图 URL。
    /// </summary>
    public string? SignboardImageUrl { get; set; }

    /// <summary>
    /// 主体类型。
    /// </summary>
    public StoreOwnershipType OwnershipType { get; set; } = StoreOwnershipType.SameEntity;

    /// <summary>
    /// 审核状态。
    /// </summary>
    public StoreAuditStatus AuditStatus { get; set; } = StoreAuditStatus.Draft;

    /// <summary>
    /// 经营状态。
    /// </summary>
    public StoreBusinessStatus BusinessStatus { get; set; } = StoreBusinessStatus.Resting;

    /// <summary>
    /// 歇业原因。
    /// </summary>
    public StoreClosureReason? ClosureReason { get; set; }

    /// <summary>
    /// 歇业原因补充说明。
    /// </summary>
    public string? ClosureReasonText { get; set; }

    /// <summary>
    /// 行业类目 ID。
    /// </summary>
    public long? CategoryId { get; set; }

    /// <summary>
    /// 审核驳回原因。
    /// </summary>
    public string? RejectionReason { get; set; }

    /// <summary>
    /// 提交审核时间。
    /// </summary>
    public DateTime? SubmittedAt { get; set; }

    /// <summary>
    /// 审核通过时间。
    /// </summary>
    public DateTime? ActivatedAt { get; set; }

    /// <summary>
    /// 强制关闭时间。
    /// </summary>
    public DateTime? ForceClosedAt { get; set; }

    /// <summary>
    /// 强制关闭原因。
    /// </summary>
    public string? ForceCloseReason { get; set; }

    /// <summary>
    /// 门店当前运营状态。
    /// </summary>
    public StoreStatus Status { get; set; } = StoreStatus.Closed;

    /// <summary>
    /// 所在国家或地区。
    /// </summary>
    public string? Country { get; set; }

    /// <summary>
    /// 所在省份。
    /// </summary>
    public string? Province { get; set; }

    /// <summary>
    /// 所在城市。
    /// </summary>
    public string? City { get; set; }

    /// <summary>
    /// 区县信息。
    /// </summary>
    public string? District { get; set; }

    /// <summary>
    /// 详细地址。
    /// </summary>
    public string? Address { get; set; }

    /// <summary>
    /// 高德/腾讯地图经度。
    /// </summary>
    public double? Longitude { get; set; }

    /// <summary>
    /// 纬度。
    /// </summary>
    public double? Latitude { get; set; }

    /// <summary>
    /// 地理定位状态。
    /// </summary>
    public GeoLocationStatus GeoStatus { get; set; } = GeoLocationStatus.Pending;

    /// <summary>
    /// 地理定位失败原因。
    /// </summary>
    public string? GeoFailReason { get; set; }

    /// <summary>
    /// 地理定位重试次数。
    /// </summary>
    public int GeoRetryCount { get; set; }

    /// <summary>
    /// 地理定位最近成功时间（UTC）。
    /// </summary>
    public DateTime? GeoUpdatedAt { get; set; }

    /// <summary>
    /// 下次地理定位重试时间（UTC）。
    /// </summary>
    public DateTime? GeoNextRetryAt { get; set; }

    /// <summary>
    /// 门店描述或公告。
    /// </summary>
    public string? Description { get; set; }

    /// <summary>
    /// 门店营业时段描述（备用字符串）。
    /// </summary>
    public string? BusinessHours { get; set; }

    /// <summary>
    /// 是否支持堂食。
    /// </summary>
    public bool SupportsDineIn { get; set; } = true;

    /// <summary>
    /// 是否支持自提。
    /// </summary>
    public bool SupportsPickup { get; set; } = true;

    /// <summary>
    /// 是否支持配送。
    /// </summary>
    public bool SupportsDelivery { get; set; } = true;

    /// <summary>
    /// 支持预约。
    /// </summary>
    public bool SupportsReservation { get; set; }

    /// <summary>
    /// 支持排队叫号。
    /// </summary>
    public bool SupportsQueueing { get; set; }

    /// <summary>
    /// 默认配送半径（公里）。
    /// </summary>
    public decimal DeliveryRadiusKm { get; set; } = 3m;

    /// <summary>
    /// 门店公告。
    /// </summary>
    public string? Announcement { get; set; }

    /// <summary>
    /// 门店标签（逗号分隔）。
    /// </summary>
    public string? Tags { get; set; }

    /// <summary>
    /// 门店海报。
    /// </summary>
    public string? CoverImageUrl { get; set; }
}
