using System.Text.Json.Serialization;
using TakeoutSaaS.Domain.Deliveries.Enums;
using TakeoutSaaS.Shared.Abstractions.Serialization;

namespace TakeoutSaaS.Application.App.Deliveries.Dto;

/// <summary>
/// 配送单 DTO。
/// </summary>
public sealed class DeliveryOrderDto
{
    /// <summary>
    /// 配送单 ID。
    /// </summary>
    [JsonConverter(typeof(SnowflakeIdJsonConverter))]
    public long Id { get; init; }

    /// <summary>
    /// 租户 ID。
    /// </summary>
    [JsonConverter(typeof(SnowflakeIdJsonConverter))]
    public long TenantId { get; init; }

    /// <summary>
    /// 订单 ID。
    /// </summary>
    [JsonConverter(typeof(SnowflakeIdJsonConverter))]
    public long OrderId { get; init; }

    /// <summary>
    /// 配送服务商。
    /// </summary>
    public DeliveryProvider Provider { get; init; }

    /// <summary>
    /// 第三方配送单号。
    /// </summary>
    public string? ProviderOrderId { get; init; }

    /// <summary>
    /// 状态。
    /// </summary>
    public DeliveryStatus Status { get; init; }

    /// <summary>
    /// 配送费。
    /// </summary>
    public decimal? DeliveryFee { get; init; }

    /// <summary>
    /// 骑手姓名。
    /// </summary>
    public string? CourierName { get; init; }

    /// <summary>
    /// 骑手电话。
    /// </summary>
    public string? CourierPhone { get; init; }

    /// <summary>
    /// 下发时间。
    /// </summary>
    public DateTime? DispatchedAt { get; init; }

    /// <summary>
    /// 取餐时间。
    /// </summary>
    public DateTime? PickedUpAt { get; init; }

    /// <summary>
    /// 完成时间。
    /// </summary>
    public DateTime? DeliveredAt { get; init; }

    /// <summary>
    /// 异常原因。
    /// </summary>
    public string? FailureReason { get; init; }

    /// <summary>
    /// 事件列表。
    /// </summary>
    public IReadOnlyList<DeliveryEventDto> Events { get; init; } = Array.Empty<DeliveryEventDto>();

    /// <summary>
    /// 创建时间。
    /// </summary>
    public DateTime CreatedAt { get; init; }
}
