package shop.alien.util.coupon;

import java.time.LocalDate;
import java.time.ZoneId;
import java.util.Date;

/**
 * 优惠券用户侧到期日：<b>默认以领取日为起点</b>，叠加模板天数（{@code specifiedDay} / {@code expirationDate}）；
 * 新建模板不应再写死用券起止；模板上的 {@code valid_date}、{@code end_date} 等仅作旧数据回退。
 */
public final class DiscountCouponExpirationUtil {

    private DiscountCouponExpirationUtil() {
    }

    /**
     * 满减、折扣等 life_discount_coupon 用户券：领取日 + 有效期（天）。
     * 天数优先取模板 {@code specifiedDay}，其次 {@code expirationDate} 整型天数字段。
     * 若均未配置正整数天数，则依次回退模板 {@code validDate}、{@code endDate}（兼容历史数据）。
     *
     * @param longTermValid 模板为 1 时表示长期有效，用户券 {@code expiration_time} 记为 {@code null}
     */
    public static LocalDate resolveLifeDiscountCouponExpiration(
            Date receiveTime,
            Integer longTermValid,
            String specifiedDay,
            Integer expirationDate,
            LocalDate templateValidDate,
            LocalDate templateEndDate,
            ZoneId zoneId) {
        if (Integer.valueOf(1).equals(longTermValid)) {
            return null;
        }
        ZoneId z = zoneId != null ? zoneId : ZoneId.systemDefault();
        Date rt = receiveTime != null ? receiveTime : new Date();
        LocalDate receiveDate = rt.toInstant().atZone(z).toLocalDate();

        Integer days = parseValidityDayCount(specifiedDay, expirationDate);
        if (days != null && days > 0) {
            return receiveDate.plusDays(days);
        }
        if (templateValidDate != null) {
            return templateValidDate;
        }
        return templateEndDate;
    }

    /**
     * life_coupon 代金券用户券：领取日 + {@code expirationDate}（天）；无天数则用券 {@code endDate} 对应日期。
     */
    public static LocalDate resolveLifeCouponVoucherExpiration(
            Date receiveTime,
            Integer voucherExpirationDays,
            Date voucherEndDate,
            ZoneId zoneId) {
        ZoneId z = zoneId != null ? zoneId : ZoneId.systemDefault();
        Date rt = receiveTime != null ? receiveTime : new Date();
        LocalDate receiveDate = rt.toInstant().atZone(z).toLocalDate();
        if (voucherExpirationDays != null && voucherExpirationDays > 0) {
            return receiveDate.plusDays(voucherExpirationDays);
        }
        if (voucherEndDate != null) {
            return voucherEndDate.toInstant().atZone(z).toLocalDate();
        }
        return null;
    }

    private static Integer parseValidityDayCount(String specifiedDay, Integer expirationDate) {
        if (specifiedDay != null && !specifiedDay.trim().isEmpty()) {
            try {
                int d = Integer.parseInt(specifiedDay.trim());
                if (d > 0) {
                    return d;
                }
            } catch (NumberFormatException ignored) {
            }
        }
        if (expirationDate != null && expirationDate > 0) {
            return expirationDate;
        }
        return null;
    }

    /**
     * 模板是否配置了「领取后 N 天有效」的正整数天数（{@code specifiedDay} 或 {@code expirationDate}）。
     * 与 {@link #resolveLifeDiscountCouponExpiration} 取天数的规则一致。
     */
    public static boolean templateHasPositiveDayValidity(String specifiedDay, Integer expirationDate) {
        return parseValidityDayCount(specifiedDay, expirationDate) != null;
    }
}
