package shop.alien.store.vo;

import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.math.BigDecimal;
import java.util.Date;

/**
 * 预订订单页面展示 VO（兼容「待支付」与「预订成功/待使用」两种页面）
 * 按订单ID查询，根据 orderStatus 展示待支付或预订成功内容。
 *
 * @author system
 */
@Data
@ApiModel(value = "ReservationOrderPageVo", description = "预订订单页面展示")
public class ReservationOrderPageVo {

    @ApiModelProperty(value = "订单ID")
    private Integer orderId;

    @ApiModelProperty(value = "订单编号")
    private String orderSn;

    @ApiModelProperty(value = "订单状态 0:待支付 1:待使用 2:已完成 3:已过期 4:已取消 5:已关闭 6:退款中 7:已退款 8:商家预订")
    private Integer orderStatus;

    @ApiModelProperty(value = "支付状态 0:未支付 1:已支付 2:已退款")
    private Integer paymentStatus;

    @ApiModelProperty(value = "页面主标题：待支付/预订成功/待使用/已完成/已过期/已取消/已关闭/退款中")
    private String pageTitle;

    @ApiModelProperty(value = "页面标题后缀：免费预订/不可免责取消/分情况是否免责")
    private String pageTitleSuffix;

    @ApiModelProperty(value = "状态副标题：如「退款成功,已按原支付路径返回」「正在为您发起退款,请耐心等待」「用户取消-不可免费」")
    private String statusSubtitle;

    // --------- 支付倒计时（待支付时有效） ---------
    @ApiModelProperty(value = "支付截止时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date paymentDeadline;

    @ApiModelProperty(value = "剩余支付秒数，用于前端倒计时「剩余 MM:SS」")
    private Integer paymentSecondsLeft;

    @ApiModelProperty(value = "待支付有效时长（分钟）")
    private Integer paymentDeadlineMinutes;

    // --------- 门店信息 ---------
    @ApiModelProperty(value = "门店ID")
    private Integer storeId;

    @ApiModelProperty(value = "门店名称")
    private String storeName;

    @ApiModelProperty(value = "门店地址")
    private String storeAddress;

    @ApiModelProperty(value = "门店电话")
    private String storeTel;

    @ApiModelProperty(value = "门店坐标（经度,纬度），用于导航")
    private String storePosition;

    // --------- 预订概要（顶部卡片） ---------
    @ApiModelProperty(value = "就餐日期 yyyy-MM-dd")
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private Date reservationDate;

    @ApiModelProperty(value = "就餐日期展示 如 02月02日 今天")
    private String reservationDateText;

    @ApiModelProperty(value = "人数/桌型描述 如 包间6人")
    private String guestAndCategoryText;

    @ApiModelProperty(value = "桌号列表 如 A01,A02")
    private String tableNumbersText;

    @ApiModelProperty(value = "就餐时间段 如 10:00-12:03")
    private String diningTimeSlotText;

    // --------- 使用凭证 ---------
    @ApiModelProperty(value = "核销码（用于展示与生成二维码）")
    private String verificationCode;

    @ApiModelProperty(value = "核销二维码内容或URL")
    private String verificationUrl;

    // --------- 预订说明 ---------
    @ApiModelProperty(value = "未按时到店座位保留时长（分钟），0 表示不保留")
    private Integer lateArrivalGraceMinutes;

    @ApiModelProperty(value = "座位保留说明 如 未按时到店座位保留30分钟")
    private String seatRetentionText;

    @ApiModelProperty(value = "订金金额（元）")
    private BigDecimal depositAmount;

    @ApiModelProperty(value = "订金说明 如 需支付¥50订金")
    private String depositText;

    @ApiModelProperty(value = "订金退还规则描述")
    private String depositRefundRule;

    @ApiModelProperty(value = "取消政策类型 0:免费预订 1:不可免费取消 2:分情况免责")
    private Integer cancellationPolicyType;

    @ApiModelProperty(value = "免费取消截止时间（分情况免责时有值）")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date freeCancellationDeadline;

    @ApiModelProperty(value = "免费取消截止展示 如 12月31日 09:00前可免责取消")
    private String freeCancellationDeadlineText;

    @ApiModelProperty(value = "取消政策说明文案")
    private String cancellationPolicyText;

    // --------- 订单信息 ---------
    @ApiModelProperty(value = "预订/下单时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date orderCreatedTime;

    @ApiModelProperty(value = "预订时间展示 如 01月01日 今天")
    private String orderCreatedTimeText;

    @ApiModelProperty(value = "预约人数")
    private Integer guestCount;

    @ApiModelProperty(value = "位置桌型 如 大厅|A01,A02")
    private String locationTableText;

    @ApiModelProperty(value = "就餐时间 如 10:00-12:00")
    private String diningTimeText;

    @ApiModelProperty(value = "联系人姓名")
    private String contactName;

    @ApiModelProperty(value = "联系人电话")
    private String contactPhone;

    @ApiModelProperty(value = "联系方式展示 如 张三 13847859088")
    private String contactText;

    // --------- 操作 ---------
    @ApiModelProperty(value = "订金金额，用于「¥50 继续支付」按钮")
    private BigDecimal payAmount;

    @ApiModelProperty(value = "是否可继续支付（待支付且未超时）")
    private Boolean canContinuePay;

    @ApiModelProperty(value = "是否显示「取消预订」按钮（待支付、待使用时为 true）")
    private Boolean canCancelReservation;

    @ApiModelProperty(value = "是否显示「修改预订」按钮（待使用时为 true）")
    private Boolean canModifyReservation;

    @ApiModelProperty(value = "是否显示「删除」按钮（已完成/已过期/已取消/已关闭/退款中为 true）")
    private Boolean canDelete;

    @ApiModelProperty(value = "是否显示「再次预订」按钮（已完成/已过期/已取消/已关闭/退款中为 true）")
    private Boolean canBookAgain;

    @ApiModelProperty(value = "当前待支付对应的商户订单号 outTradeNo，仅待支付且存在支付单时返回，用于轮询 queryStatus")
    private String outTradeNo;
}
