package com.sqx.modules.utils;

import com.sqx.common.exception.SqxException;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
import java.time.temporal.ChronoUnit;

/**
 * VIP有效期校验工具类
 * 提供VIP过期状态检查、剩余天数计算等功能
 */
public class VipExpirationUtil {
    
    /**
     * VIP过期时间格式（yyyy-MM-dd HH:mm:ss）
     */
    public static final String VIP_DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";
    
    /**
     * 日期时间格式化器
     */
    private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern(VIP_DATE_FORMAT);
    
    /**
     * 检查VIP是否已过期
     * @param vipExpirationTime VIP过期时间字符串（yyyy-MM-dd HH:mm:ss格式）
     * @return 如果已过期返回true，否则返回false
     * @throws SqxException 当时间格式错误时抛出
     */
    public static boolean isVipExpired(String vipExpirationTime) {
        if (vipExpirationTime == null || vipExpirationTime.trim().isEmpty()) {
            return true; // 空值视为已过期
        }
        try {
            // 过期时间
            LocalDateTime expirationDateTime = LocalDateTime.parse(vipExpirationTime, FORMATTER);
            
            return LocalDateTime.now().isAfter(expirationDateTime);
        } catch (DateTimeParseException e) {
            throw new SqxException("VIP过期时间格式错误，应为：" + VIP_DATE_FORMAT, e);
        }
    }
    
    /**
     * 检查VIP是否在有效期内
     * @param vipExpirationTime VIP过期时间字符串（yyyy-MM-dd HH:mm:ss格式）
     * @return 如果在有效期内返回true，否则返回false
     */
    public static boolean isVipValid(String vipExpirationTime) {
        return !isVipExpired(vipExpirationTime);
    }
    
    /**
     * 计算VIP剩余天数
     * @param vipExpirationTime VIP过期时间字符串（yyyy-MM-dd HH:mm:ss格式）
     * @return VIP剩余天数，如果已过期则返回负数
     * @throws IllegalArgumentException 当时间格式错误时抛出
     */
    public static long getRemainingDays(String vipExpirationTime) {
        if (vipExpirationTime == null || vipExpirationTime.trim().isEmpty()) {
            return -1; // 空值视为已过期
        }
        
        try {
            // 过期时间
            LocalDateTime expirationDateTime = LocalDateTime.parse(vipExpirationTime, FORMATTER);
            
            // 计算剩余天数
            return ChronoUnit.DAYS.between(LocalDateTime.now(), expirationDateTime);
            
        } catch (DateTimeParseException e) {
            throw new SqxException("VIP过期时间格式错误，应为：" + VIP_DATE_FORMAT, e);
        }
    }
    
    /**
     * 格式化当前时间为VIP日期格式
     * @return 格式化后的当前时间字符串
     */
    public static String formatCurrentTime() {
        return FORMATTER.format(LocalDateTime.now());
    }
    
    /**
     * 格式化指定时间为VIP日期格式
     * @param dateTime 要格式化的时间
     * @return 格式化后的时间字符串
     */
    public static String formatDateTime(LocalDateTime dateTime) {
        if (dateTime == null) {
            return null;
        }
        return FORMATTER.format(dateTime);
    }
    
    /**
     * 获取指定天数后的时间并格式化为VIP日期格式
     * 用于计算VIP有效期延长
     * @param days 天数
     * @return 格式化后的未来时间字符串
     */
    public static String getFutureTimeWithDays(int days) {
        LocalDateTime futureDateTime = LocalDateTime.now().plusDays(days);
        return FORMATTER.format(futureDateTime);
    }
}
