package com.jeesharp.business.modules.pay.dto;

import lombok.Data;

import java.util.Date;
import java.util.List;

/**
 * 支付下单/查单/退款通用请求数据（跨模块 API 入参基类）。
 *
 * @author jeesharp
 * @since 2026-05-25
 */
@Data
public class BasicPayOrderData {

    /** 缴费方式：{@link com.jeesharp.business.modules.pay.enums.PayTypeStyle} 的 value（1 微信 2 支付宝 3 浦发 4 TLinx） */
    private String payType;

    /** 缴费用户 ID */
    private String userId;

    /** 公司 ID */
    private String companyId;

    /** 缴费金额（分） */
    private Long payAmount;

    /** 退款金额（分） */
    private Long refundAmount;

    /** 订单编号（系统支付单主键/商户单号） */
    private String orderNumber;

    /** 商品标题 */
    private String subject;

    /** 商品描述 */
    private String description;

    /** 异步通知地址 */
    private String notifyUrl;

    /** 微信 attach（建议 JSON，含 bizType、orderId、payOrderId 等，供支付回调解析） */
    private String attach;

    /**
     * 微信 V3 付款人 openid（JSAPI 必填；APP 可不填）。
     */
    private String payerOpenId;

    /**
     * 微信 V3 交易类型：{@code JSAPI}（小程序/公众号）、{@code APP}（原生 App）。默认 JSAPI。
     */
    private String wxTradeType;

    /**
     * 杏花村业务场景（如 HOTEL_ORDER）；非空表示走 {@code biz_finance_pay_order}，不落 {@code sys_pay_order}。
     */
    private String bizScene;

    /** 业务订单主键（与 bizScene 配套） */
    private String bizOrderId;

    /** 财务支付单主键（createIntent 后回填，可选） */
    private String financePayOrderId;

    /**
     * 租户 ID：用于按租户选择支付渠道配置；为空则使用平台默认配置。
     */
    private String tenantId;

    /**
     * 结算模式：{@link com.jeesharp.business.modules.finance.merchantsettle.enums.SettleModeEnum} 的 value。
     */
    private String settleMode;

    /**
     * 是否在微信 V3 下单标记分账（profit_sharing=true）；仅 PARTNER 模式有效。
     */
    private Boolean needProfitSharing;

    /**
     * partner/合单子单明细；PARTNER 模式必填。
     */
    private java.util.List<PayWechatSubPayItemDTO> subPayItems;

    /** 订单二维码 URL */
    private String qrCodeUrl;

    /** 订单失效时间 */
    private Date expireTime;

    /**
     * 是否为杏花村财务主单链路（仅渠道下单/回调，主单由 finance 模块维护）。
     */
    public boolean isTravelFinanceOrder() {
        return bizScene != null && !bizScene.isBlank();
    }
}
