package com.erp.tenant.service;

import com.erp.tenant.dto.*;
import com.erp.tenant.entity.Tenant;
import com.erp.tenant.entity.TenantStats;

import java.util.List;
import java.util.Map;
import com.erp.common.core.model.PageResponse;

/**
 * 租户服务接口
 */
public interface TenantService {
    
    // ==================== 租户管理 ====================
    
    /**
     * 分页查询租户列表
     *
     * @param keyword  搜索关键字
     * @param status   状态筛选
     * @param expired  是否过期筛选（null-全部，true-已过期，false-未过期）
     * @param page     页码
     * @param pageSize 每页记录数
     * @return 分页响应
     */
    PageResponse<TenantListResponse> listTenants(String keyword, Integer status, Boolean expired, Integer page, Integer pageSize);
    
    /**
     * 获取租户详情
     *
     * @param id 租户ID
     * @return 租户详情响应
     */
    TenantDetailResponse getTenantById(Long id);
    
    /**
     * 根据编码获取租户
     *
     * @param code 租户编码
     * @return 租户详情响应
     */
    TenantDetailResponse getTenantByCode(String code);
    
    /**
     * 创建租户
     *
     * @param request 创建请求
     * @return 租户详情响应
     */
    TenantDetailResponse createTenant(CreateTenantRequest request);
    
    /**
     * 更新租户
     *
     * @param id      租户ID
     * @param request 更新请求
     * @return 租户详情响应
     */
    TenantDetailResponse updateTenant(Long id, UpdateTenantRequest request);
    
    /**
     * 删除租户
     *
     * @param id 租户ID
     */
    void deleteTenant(Long id);
    
    /**
     * 切换租户状态
     *
     * @param id 租户ID
     * @return 更新后的状态信息
     */
    TenantStatusVO toggleStatus(Long id);
    
    /**
     * 暂停租户
     *
     * @param id 租户ID
     */
    void suspendTenant(Long id);
    
    /**
     * 恢复租户
     *
     * @param id 租户ID
     */
    void activateTenant(Long id);
    
    /**
     * 批量操作：批量启用/禁用
     *
     * @param ids   租户ID列表
     * @param status 新状态
     */
    void batchUpdateStatus(List<Long> ids, Integer status);
    
    // ==================== 套餐管理 ====================
    
    /**
     * 分页查询套餐列表
     *
     * @param page     页码
     * @param pageSize 每页记录数
     * @return 分页响应
     */
    PageResponse<PackageResponse> listPackages(Integer page, Integer pageSize);
    
    /**
     * 获取套餐详情
     *
     * @param id 套餐ID
     * @return 套餐详情
     */
    PackageResponse getPackageById(Long id);
    
    /**
     * 获取启用的套餐列表
     *
     * @return 套餐列表
     */
    List<PackageResponse> listActivePackages();
    
    /**
     * 创建套餐
     *
     * @param request 创建请求
     * @return 套餐详情
     */
    PackageResponse createPackage(CreatePackageRequest request);
    
    /**
     * 更新套餐
     *
     * @param id      套餐ID
     * @param request 更新请求
     * @return 套餐详情
     */
    PackageResponse updatePackage(Long id, CreatePackageRequest request);
    
    /**
     * 删除套餐
     *
     * @param id 套餐ID
     */
    void deletePackage(Long id);
    
    /**
     * 设置默认套餐
     *
     * @param id 套餐ID
     */
    void setDefaultPackage(Long id);
    
    /**
     * 切换套餐状态
     *
     * @param id 套餐ID
     * @return 更新后的状态
     */
    Integer togglePackageStatus(Long id);

    /**
     * 审核通过租户
     *
     * @param id 租户ID
     * @return 操作结果（包含初始化信息）
     */
    Map<String, Object> approveTenant(Long id);

    /**
     * 审核拒绝租户
     *
     * @param id 租户ID
     * @param reason 拒绝原因
     */
    void rejectTenant(Long id, String reason);

    /**
     * 手动推送套餐配置到Nacos
     *
     * @param packageId 套餐ID
     */
    void pushPackageToNacos(Long packageId);

    // ==================== 租户统计 ====================
    
    /**
     * 获取租户统计信息
     *
     * @param tenantId 租户ID
     * @return 统计信息
     */
    TenantStats getTenantStats(Long tenantId);
    
    /**
     * 获取系统概览统计
     *
     * @return 系统统计
     */
    SystemOverview getSystemOverview();
    
    // ==================== 租户查询辅助 ====================
    
    /**
     * 检查租户编码是否存在
     *
     * @param code 租户编码
     * @return 是否存在
     */
    boolean existsByCode(String code);
    
    /**
     * 检查租户是否可删除
     *
     * @param id 租户ID
     * @return 是否可删除
     */
    boolean canDelete(Long id);
    
    /**
     * 验证租户是否有效（未过期且正常）
     *
     * @param id 租户ID
     * @return 是否有效
     */
    boolean isValid(Long id);
    
    /**
     * 状态VO
     */
    @lombok.Data
    @lombok.AllArgsConstructor
    class TenantStatusVO {
        private Long id;
        private Integer status;
        private String statusLabel;
    }
    
    /**
     * 系统概览统计
     */
    @lombok.Data
    @lombok.Builder
    @lombok.NoArgsConstructor
    @lombok.AllArgsConstructor
    class SystemOverview {
        private Long totalTenants;
        private Long activeTenants;
        private Long expiredTenants;
        private Long suspendedTenants;
        private Long totalPackages;
        private Long activePackages;
    }
}
