package com.gxwebsoft.common.system.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.gxwebsoft.common.system.entity.TenantSubscription;

import java.util.List;

/**
 * 租户订阅记录Service
 *
 * @author WebSoft
 * @since 2025-12-12
 */
public interface TenantSubscriptionService extends IService<TenantSubscription> {

    /**
     * 根据租户ID查询订阅信息
     *
     * @param tenantId 租户ID
     * @return TenantSubscription
     */
    TenantSubscription getByTenantId(Integer tenantId);

    /**
     * 创建或更新订阅
     *
     * @param tenantId  租户ID
     * @param packageId 套餐ID
     * @param version   版本号
     * @param startTime 开始时间
     * @param endTime   到期时间
     * @param isTrial   是否试用
     * @return TenantSubscription
     */
    TenantSubscription createOrUpdateSubscription(Integer tenantId, Integer packageId, Integer version,
                                                   java.util.Date startTime, java.util.Date endTime, Integer isTrial);

    /**
     * 升级订阅
     *
     * @param tenantId     租户ID
     * @param newPackageId 新套餐ID
     * @return boolean
     */
    boolean upgradeSubscription(Integer tenantId, Integer newPackageId);

    /**
     * 续费订阅
     *
     * @param tenantId 租户ID
     * @param months   续费月数
     * @return boolean
     */
    boolean renewSubscription(Integer tenantId, Integer months);

    /**
     * 设置自动续费
     *
     * @param tenantId          租户ID
     * @param autoRenewal       是否自动续费
     * @param renewalPackageId  续费套餐ID
     * @return boolean
     */
    boolean setAutoRenewal(Integer tenantId, Integer autoRenewal, Integer renewalPackageId);

    /**
     * 检查订阅是否有效
     *
     * @param tenantId 租户ID
     * @return boolean
     */
    boolean isSubscriptionValid(Integer tenantId);

    /**
     * 检查订阅是否过期
     *
     * @param tenantId 租户ID
     * @return boolean
     */
    boolean isSubscriptionExpired(Integer tenantId);

    /**
     * 查询即将过期的订阅
     *
     * @param days 提前天数
     * @return List<TenantSubscription>
     */
    List<TenantSubscription> listExpiringSoon(Integer days);

    /**
     * 查询已过期的订阅
     *
     * @return List<TenantSubscription>
     */
    List<TenantSubscription> listExpired();

    /**
     * 标记订阅为已过期
     *
     * @param subscriptionId 订阅ID
     * @return boolean
     */
    boolean markAsExpired(Long subscriptionId);

    /**
     * 发送过期提醒
     *
     * @param subscriptionId 订阅ID
     * @param notifyStatus   提醒状态
     * @return boolean
     */
    boolean sendExpiryNotification(Long subscriptionId, Integer notifyStatus);
}
