package com.dora.mapper;

import com.dora.entity.AdminUser;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 管理员用户Mapper接口
 */
@Mapper
public interface AdminUserMapper {

    /**
     * 插入管理员用户
     */
    int insert(AdminUser adminUser);

    /**
     * 根据ID查询管理员用户
     */
    AdminUser selectById(@Param("id") Long id);

    /**
     * 根据用户名查询管理员用户
     */
    AdminUser selectByUsername(@Param("username") String username);

    /**
     * 检查用户名是否存在
     */
    boolean existsByUsername(@Param("username") String username);

    /**
     * 检查数据库中是否存在任何管理员账号
     */
    boolean hasAnyAdmin();

    /**
     * 更新管理员用户
     */
    int updateById(AdminUser adminUser);

    /**
     * 更新密码
     */
    int updatePassword(@Param("id") Long id, @Param("passwordHash") String passwordHash);

    /**
     * 查询所有管理员用户
     */
    List<AdminUser> selectAll();

    /**
     * 按关键词分页查询员工
     * @param keyword 关键词（姓名、用户名、邮箱、手机号）
     * @param status 状态筛选
     * @param department 部门筛选
     * @param offset 偏移量
     * @param limit 限制数量
     * @return 员工列表
     */
    List<AdminUser> selectByKeywordPaged(@Param("keyword") String keyword,
                                        @Param("status") Integer status,
                                        @Param("department") String department,
                                        @Param("offset") int offset,
                                        @Param("limit") int limit);

    /**
     * 按关键词统计员工数量
     */
    Long countByKeyword(@Param("keyword") String keyword,
                       @Param("status") Integer status,
                       @Param("department") String department);

    /**
     * 按条件分页查询员工
     * @param status 状态筛选
     * @param department 部门筛选
     * @param offset 偏移量
     * @param limit 限制数量
     * @return 员工列表
     */
    List<AdminUser> selectByConditionPaged(@Param("status") Integer status,
                                          @Param("department") String department,
                                          @Param("offset") int offset,
                                          @Param("limit") int limit);

    /**
     * 按条件统计员工数量
     */
    Long countByCondition(@Param("status") Integer status,
                         @Param("department") String department);

    /**
     * 根据角色查询管理员用户
     */
    List<AdminUser> selectByRole(@Param("role") Integer role);

    /**
     * 统计管理员用户数量
     */
    Long countAll();

    /**
     * 统计指定角色的用户数量
     */
    Long countByRole(@Param("role") Integer role);

    /**
     * 删除管理员用户（逻辑删除）
     */
    int deleteById(@Param("id") Long id);

    // ====== 仪表盘统计相关 ======

    /**
     * 统计总用户数
     */
    Long countTotalUsers();

    /**
     * 统计今日新增用户数
     */
    Long countTodayNewUsers(@Param("today") LocalDateTime today);

    /**
     * 统计活跃用户数（最近7天登录过的用户）
     */
    Long countActiveUsers(@Param("sevenDaysAgo") LocalDateTime sevenDaysAgo);

    /**
     * 统计付费用户数（有购买记录的用户）
     */
    Long countPaidUsers();

    /**
     * 统计总工作流数
     */
    Long countTotalWorkflows();

    /**
     * 统计今日新增工作流数
     */
    Long countTodayNewWorkflows(@Param("today") LocalDateTime today);

    /**
     * 统计总视频数
     */
    Long countTotalVideos();

    /**
     * 统计今日新增视频数
     */
    Long countTodayNewVideos(@Param("today") LocalDateTime today);

    /**
     * 统计待审核内容数
     */
    Long countPendingAuditContent();
} 