namespace TakeoutSaaS.TenantApi.Contracts.Product;

/// <summary>
/// 商品列表查询请求。
/// </summary>
public sealed class ProductListRequest
{
    /// <summary>
    /// 门店 ID。
    /// </summary>
    public string StoreId { get; set; } = string.Empty;

    /// <summary>
    /// 分类 ID。
    /// </summary>
    public string? CategoryId { get; set; }

    /// <summary>
    /// 关键字。
    /// </summary>
    public string? Keyword { get; set; }

    /// <summary>
    /// 状态（on_sale/off_shelf/sold_out）。
    /// </summary>
    public string? Status { get; set; }

    /// <summary>
    /// 类型（single/combo）。
    /// </summary>
    public string? Kind { get; set; }

    /// <summary>
    /// 页码。
    /// </summary>
    public int Page { get; set; } = 1;

    /// <summary>
    /// 每页条数。
    /// </summary>
    public int PageSize { get; set; } = 20;
}

/// <summary>
/// 商品详情查询请求。
/// </summary>
public sealed class ProductDetailRequest
{
    /// <summary>
    /// 门店 ID。
    /// </summary>
    public string StoreId { get; set; } = string.Empty;

    /// <summary>
    /// 商品 ID。
    /// </summary>
    public string ProductId { get; set; } = string.Empty;
}

/// <summary>
/// 保存商品请求。
/// </summary>
public sealed class SaveProductRequest
{
    /// <summary>
    /// 门店 ID。
    /// </summary>
    public string StoreId { get; set; } = string.Empty;

    /// <summary>
    /// 商品 ID（编辑时传）。
    /// </summary>
    public string? Id { get; set; }

    /// <summary>
    /// 分类 ID。
    /// </summary>
    public string CategoryId { get; set; } = string.Empty;

    /// <summary>
    /// 商品类型（single/combo）。
    /// </summary>
    public string? Kind { get; set; }

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

    /// <summary>
    /// 副标题。
    /// </summary>
    public string Subtitle { get; set; } = string.Empty;

    /// <summary>
    /// 描述。
    /// </summary>
    public string Description { get; set; } = string.Empty;

    /// <summary>
    /// 售价。
    /// </summary>
    public decimal Price { get; set; }

    /// <summary>
    /// 原价。
    /// </summary>
    public decimal? OriginalPrice { get; set; }

    /// <summary>
    /// 库存。
    /// </summary>
    public int Stock { get; set; }

    /// <summary>
    /// 排序权重。
    /// </summary>
    public int? SortWeight { get; set; }

    /// <summary>
    /// 库存预警值。
    /// </summary>
    public int? WarningStock { get; set; }

    /// <summary>
    /// 打包费。
    /// </summary>
    public decimal? PackingFee { get; set; }

    /// <summary>
    /// 标签。
    /// </summary>
    public List<string> Tags { get; set; } = [];

    /// <summary>
    /// 状态（on_sale/off_shelf/sold_out）。
    /// </summary>
    public string Status { get; set; } = "off_shelf";

    /// <summary>
    /// 上架方式（draft/now/scheduled）。
    /// </summary>
    public string ShelfMode { get; set; } = "draft";

    /// <summary>
    /// SPU 编码（可选）。
    /// </summary>
    public string? SpuCode { get; set; }

    /// <summary>
    /// 定时上架时间。
    /// </summary>
    public string? TimedOnShelfAt { get; set; }

    /// <summary>
    /// 商品图片地址列表。
    /// </summary>
    public List<string> ImageUrls { get; set; } = [];

    /// <summary>
    /// 关联规格模板 ID。
    /// </summary>
    public List<string>? SpecTemplateIds { get; set; }

    /// <summary>
    /// 关联加料组模板 ID。
    /// </summary>
    public List<string>? AddonGroupIds { get; set; }

    /// <summary>
    /// 关联标签 ID。
    /// </summary>
    public List<string>? LabelIds { get; set; }

    /// <summary>
    /// SKU 列表。
    /// </summary>
    public List<SaveProductSkuRequest>? Skus { get; set; }

    /// <summary>
    /// 套餐分组。
    /// </summary>
    public List<SaveProductComboGroupRequest> ComboGroups { get; set; } = [];
}

/// <summary>
/// 商品异步保存响应（基础信息已落库，SKU 任务异步处理）。
/// </summary>
public sealed class SaveProductAsyncResponse
{
    /// <summary>
    /// 门店 ID。
    /// </summary>
    public string StoreId { get; set; } = string.Empty;

    /// <summary>
    /// 商品 ID。
    /// </summary>
    public string ProductId { get; set; } = string.Empty;

    /// <summary>
    /// SKU 任务 ID（无任务时为 null）。
    /// </summary>
    public string? SkuJobId { get; set; }

    /// <summary>
    /// SKU 任务状态（queued/running/failed/not_required）。
    /// </summary>
    public string SkuJobStatus { get; set; } = "not_required";

    /// <summary>
    /// 结果说明。
    /// </summary>
    public string? Message { get; set; }
}

/// <summary>
/// 保存商品套餐分组请求。
/// </summary>
public sealed class SaveProductComboGroupRequest
{
    /// <summary>
    /// 分组名称。
    /// </summary>
    public string Name { get; set; } = string.Empty;

    /// <summary>
    /// 最小选择数。
    /// </summary>
    public int MinSelect { get; set; } = 1;

    /// <summary>
    /// 最大选择数。
    /// </summary>
    public int MaxSelect { get; set; } = 1;

    /// <summary>
    /// 分组排序。
    /// </summary>
    public int SortOrder { get; set; }

    /// <summary>
    /// 分组内商品。
    /// </summary>
    public List<SaveProductComboGroupItemRequest> Items { get; set; } = [];
}

/// <summary>
/// 保存商品套餐分组商品请求。
/// </summary>
public sealed class SaveProductComboGroupItemRequest
{
    /// <summary>
    /// 商品 ID。
    /// </summary>
    public string ProductId { get; set; } = string.Empty;

    /// <summary>
    /// 数量。
    /// </summary>
    public int Quantity { get; set; } = 1;

    /// <summary>
    /// 排序。
    /// </summary>
    public int SortOrder { get; set; }
}

/// <summary>
/// 保存商品 SKU 请求。
/// </summary>
public sealed class SaveProductSkuRequest
{
    /// <summary>
    /// SKU 编码（可选）。
    /// </summary>
    public string? SkuCode { get; set; }

    /// <summary>
    /// 售价。
    /// </summary>
    public decimal Price { get; set; }

    /// <summary>
    /// 划线价。
    /// </summary>
    public decimal? OriginalPrice { get; set; }

    /// <summary>
    /// 库存。
    /// </summary>
    public int Stock { get; set; }

    /// <summary>
    /// 是否启用。
    /// </summary>
    public bool IsEnabled { get; set; } = true;

    /// <summary>
    /// 排序。
    /// </summary>
    public int SortOrder { get; set; }

    /// <summary>
    /// 规格属性组合。
    /// </summary>
    public List<SaveProductSkuAttributeRequest> Attributes { get; set; } = [];
}

/// <summary>
/// SKU 规格属性请求。
/// </summary>
public sealed class SaveProductSkuAttributeRequest
{
    /// <summary>
    /// 模板 ID。
    /// </summary>
    public string TemplateId { get; set; } = string.Empty;

    /// <summary>
    /// 选项 ID。
    /// </summary>
    public string OptionId { get; set; } = string.Empty;
}

/// <summary>
/// 创建商品 SKU 异步保存任务请求。
/// </summary>
public sealed class CreateProductSkuSaveJobRequest
{
    /// <summary>
    /// 门店 ID。
    /// </summary>
    public string StoreId { get; set; } = string.Empty;

    /// <summary>
    /// 商品 ID。
    /// </summary>
    public string ProductId { get; set; } = string.Empty;

    /// <summary>
    /// 关联规格模板 ID（可选，未传则使用当前商品关联）。
    /// </summary>
    public List<string>? SpecTemplateIds { get; set; }

    /// <summary>
    /// SKU 列表。
    /// </summary>
    public List<SaveProductSkuRequest>? Skus { get; set; }
}

/// <summary>
/// 查询商品 SKU 异步任务状态请求。
/// </summary>
public sealed class ProductSkuSaveJobStatusRequest
{
    /// <summary>
    /// 门店 ID。
    /// </summary>
    public string StoreId { get; set; } = string.Empty;
}

/// <summary>
/// 商品 SKU 异步保存任务响应。
/// </summary>
public sealed class ProductSkuSaveJobResponse
{
    /// <summary>
    /// 任务 ID。
    /// </summary>
    public string JobId { get; set; } = string.Empty;

    /// <summary>
    /// 门店 ID。
    /// </summary>
    public string StoreId { get; set; } = string.Empty;

    /// <summary>
    /// 商品 ID。
    /// </summary>
    public string ProductId { get; set; } = string.Empty;

    /// <summary>
    /// 任务状态（queued/running/succeeded/failed/canceled）。
    /// </summary>
    public string Status { get; set; } = "queued";

    /// <summary>
    /// 总处理数。
    /// </summary>
    public int ProgressTotal { get; set; }

    /// <summary>
    /// 已处理数。
    /// </summary>
    public int ProgressProcessed { get; set; }

    /// <summary>
    /// 失败数。
    /// </summary>
    public int FailedCount { get; set; }

    /// <summary>
    /// 错误信息。
    /// </summary>
    public string? ErrorMessage { get; set; }

    /// <summary>
    /// 创建时间。
    /// </summary>
    public string CreatedAt { get; set; } = string.Empty;

    /// <summary>
    /// 开始时间。
    /// </summary>
    public string? StartedAt { get; set; }

    /// <summary>
    /// 完成时间。
    /// </summary>
    public string? FinishedAt { get; set; }
}

/// <summary>
/// 删除商品请求。
/// </summary>
public sealed class DeleteProductRequest
{
    /// <summary>
    /// 门店 ID。
    /// </summary>
    public string StoreId { get; set; } = string.Empty;

    /// <summary>
    /// 商品 ID。
    /// </summary>
    public string ProductId { get; set; } = string.Empty;
}

/// <summary>
/// 商品状态变更请求。
/// </summary>
public sealed class ChangeProductStatusRequest
{
    /// <summary>
    /// 门店 ID。
    /// </summary>
    public string StoreId { get; set; } = string.Empty;

    /// <summary>
    /// 商品 ID。
    /// </summary>
    public string ProductId { get; set; } = string.Empty;

    /// <summary>
    /// 状态（on_sale/off_shelf/sold_out）。
    /// </summary>
    public string Status { get; set; } = "off_shelf";
}

/// <summary>
/// 商品沽清请求。
/// </summary>
public sealed class SoldoutProductRequest
{
    /// <summary>
    /// 门店 ID。
    /// </summary>
    public string StoreId { get; set; } = string.Empty;

    /// <summary>
    /// 商品 ID。
    /// </summary>
    public string ProductId { get; set; } = string.Empty;

    /// <summary>
    /// 沽清模式（today/timed/permanent）。
    /// </summary>
    public string Mode { get; set; } = "today";

    /// <summary>
    /// 剩余可售。
    /// </summary>
    public int RemainStock { get; set; }

    /// <summary>
    /// 沽清原因。
    /// </summary>
    public string Reason { get; set; } = string.Empty;

    /// <summary>
    /// 恢复时间。
    /// </summary>
    public string? RecoverAt { get; set; }

    /// <summary>
    /// 同步平台。
    /// </summary>
    public bool SyncToPlatform { get; set; } = true;

    /// <summary>
    /// 通知店长。
    /// </summary>
    public bool NotifyManager { get; set; }
}

/// <summary>
/// 批量操作请求。
/// </summary>
public sealed class BatchProductActionRequest
{
    /// <summary>
    /// 门店 ID。
    /// </summary>
    public string StoreId { get; set; } = string.Empty;

    /// <summary>
    /// 动作（batch_on/batch_off/batch_delete/batch_soldout）。
    /// </summary>
    public string Action { get; set; } = string.Empty;

    /// <summary>
    /// 商品 ID 列表。
    /// </summary>
    public List<string> ProductIds { get; set; } = [];

    /// <summary>
    /// 剩余可售（沽清时）。
    /// </summary>
    public int? RemainStock { get; set; }

    /// <summary>
    /// 原因（沽清时）。
    /// </summary>
    public string? Reason { get; set; }

    /// <summary>
    /// 恢复时间（沽清时）。
    /// </summary>
    public string? RecoverAt { get; set; }

    /// <summary>
    /// 同步平台（沽清时）。
    /// </summary>
    public bool? SyncToPlatform { get; set; }

    /// <summary>
    /// 通知店长（沽清时）。
    /// </summary>
    public bool? NotifyManager { get; set; }
}

/// <summary>
/// 商品列表响应。
/// </summary>
public sealed class ProductListResultResponse
{
    /// <summary>
    /// 列表项。
    /// </summary>
    public List<ProductListItemResponse> Items { get; set; } = [];

    /// <summary>
    /// 总数。
    /// </summary>
    public int Total { get; set; }

    /// <summary>
    /// 页码。
    /// </summary>
    public int Page { get; set; }

    /// <summary>
    /// 每页条数。
    /// </summary>
    public int PageSize { get; set; }
}

/// <summary>
/// 商品列表项响应。
/// </summary>
public class ProductListItemResponse
{
    /// <summary>
    /// 商品 ID。
    /// </summary>
    public string Id { get; set; } = string.Empty;

    /// <summary>
    /// 分类 ID。
    /// </summary>
    public string CategoryId { get; set; } = string.Empty;

    /// <summary>
    /// 分类名称。
    /// </summary>
    public string CategoryName { get; set; } = string.Empty;

    /// <summary>
    /// 图片地址。
    /// </summary>
    public string ImageUrl { get; set; } = string.Empty;

    /// <summary>
    /// 商品类型（single/combo）。
    /// </summary>
    public string Kind { get; set; } = "single";

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

    /// <summary>
    /// 原价。
    /// </summary>
    public decimal? OriginalPrice { get; set; }

    /// <summary>
    /// 售价。
    /// </summary>
    public decimal Price { get; set; }

    /// <summary>
    /// 月销量。
    /// </summary>
    public int SalesMonthly { get; set; }

    /// <summary>
    /// 沽清模式。
    /// </summary>
    public string? SoldoutMode { get; set; }

    /// <summary>
    /// SPU 编码。
    /// </summary>
    public string SpuCode { get; set; } = string.Empty;

    /// <summary>
    /// 状态（on_sale/off_shelf/sold_out）。
    /// </summary>
    public string Status { get; set; } = "off_shelf";

    /// <summary>
    /// 库存。
    /// </summary>
    public int Stock { get; set; }

    /// <summary>
    /// 副标题。
    /// </summary>
    public string Subtitle { get; set; } = string.Empty;

    /// <summary>
    /// 标签。
    /// </summary>
    public List<string> Tags { get; set; } = [];
}

/// <summary>
/// 商品详情响应。
/// </summary>
public sealed class ProductDetailResponse : ProductListItemResponse
{
    /// <summary>
    /// 排序权重。
    /// </summary>
    public int SortWeight { get; set; }

    /// <summary>
    /// 库存预警值。
    /// </summary>
    public int? WarningStock { get; set; }

    /// <summary>
    /// 打包费。
    /// </summary>
    public decimal? PackingFee { get; set; }

    /// <summary>
    /// 套餐分组。
    /// </summary>
    public List<ProductComboGroupResponse> ComboGroups { get; set; } = [];

    /// <summary>
    /// 商品图片列表。
    /// </summary>
    public List<string> ImageUrls { get; set; } = [];

    /// <summary>
    /// 商品描述。
    /// </summary>
    public string Description { get; set; } = string.Empty;

    /// <summary>
    /// 关联规格模板 ID。
    /// </summary>
    public List<string> SpecTemplateIds { get; set; } = [];

    /// <summary>
    /// 关联加料组模板 ID。
    /// </summary>
    public List<string> AddonGroupIds { get; set; } = [];

    /// <summary>
    /// 关联标签 ID。
    /// </summary>
    public List<string> LabelIds { get; set; } = [];

    /// <summary>
    /// SKU 列表。
    /// </summary>
    public List<ProductSkuResponse> Skus { get; set; } = [];

    /// <summary>
    /// 定时上架时间。
    /// </summary>
    public string? TimedOnShelfAt { get; set; }

    /// <summary>
    /// 是否通知店长。
    /// </summary>
    public bool NotifyManager { get; set; }

    /// <summary>
    /// 恢复时间。
    /// </summary>
    public string? RecoverAt { get; set; }

    /// <summary>
    /// 剩余可售。
    /// </summary>
    public int RemainStock { get; set; }

    /// <summary>
    /// 沽清原因。
    /// </summary>
    public string SoldoutReason { get; set; } = string.Empty;

    /// <summary>
    /// 是否同步平台。
    /// </summary>
    public bool SyncToPlatform { get; set; }
}

/// <summary>
/// 套餐分组响应。
/// </summary>
public sealed class ProductComboGroupResponse
{
    /// <summary>
    /// 分组 ID。
    /// </summary>
    public string Id { get; set; } = string.Empty;

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

    /// <summary>
    /// 最小选择数。
    /// </summary>
    public int MinSelect { get; set; }

    /// <summary>
    /// 最大选择数。
    /// </summary>
    public int MaxSelect { get; set; }

    /// <summary>
    /// 排序。
    /// </summary>
    public int SortOrder { get; set; }

    /// <summary>
    /// 分组商品列表。
    /// </summary>
    public List<ProductComboGroupItemResponse> Items { get; set; } = [];
}

/// <summary>
/// 套餐分组商品响应。
/// </summary>
public sealed class ProductComboGroupItemResponse
{
    /// <summary>
    /// 商品 ID。
    /// </summary>
    public string ProductId { get; set; } = string.Empty;

    /// <summary>
    /// 商品名称。
    /// </summary>
    public string ProductName { get; set; } = string.Empty;

    /// <summary>
    /// 数量。
    /// </summary>
    public int Quantity { get; set; }

    /// <summary>
    /// 排序。
    /// </summary>
    public int SortOrder { get; set; }
}

/// <summary>
/// 商品 SKU 响应。
/// </summary>
public sealed class ProductSkuResponse
{
    /// <summary>
    /// SKU ID。
    /// </summary>
    public string Id { get; set; } = string.Empty;

    /// <summary>
    /// SKU 编码。
    /// </summary>
    public string SkuCode { get; set; } = string.Empty;

    /// <summary>
    /// 售价。
    /// </summary>
    public decimal Price { get; set; }

    /// <summary>
    /// 划线价。
    /// </summary>
    public decimal? OriginalPrice { get; set; }

    /// <summary>
    /// 库存。
    /// </summary>
    public int Stock { get; set; }

    /// <summary>
    /// 是否启用。
    /// </summary>
    public bool IsEnabled { get; set; }

    /// <summary>
    /// 排序。
    /// </summary>
    public int SortOrder { get; set; }

    /// <summary>
    /// 规格属性。
    /// </summary>
    public List<ProductSkuAttributeResponse> Attributes { get; set; } = [];
}

/// <summary>
/// SKU 规格属性响应。
/// </summary>
public sealed class ProductSkuAttributeResponse
{
    /// <summary>
    /// 模板 ID。
    /// </summary>
    public string TemplateId { get; set; } = string.Empty;

    /// <summary>
    /// 选项 ID。
    /// </summary>
    public string OptionId { get; set; } = string.Empty;
}

/// <summary>
/// 批量操作响应。
/// </summary>
public sealed class BatchProductActionResultResponse
{
    /// <summary>
    /// 动作。
    /// </summary>
    public string Action { get; set; } = string.Empty;

    /// <summary>
    /// 总条数。
    /// </summary>
    public int TotalCount { get; set; }

    /// <summary>
    /// 成功条数。
    /// </summary>
    public int SuccessCount { get; set; }

    /// <summary>
    /// 失败条数。
    /// </summary>
    public int FailedCount { get; set; }
}
