package shop.alien.storeplatform.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import shop.alien.entity.store.StorePlatformRole;
import shop.alien.entity.store.vo.StorePlatformRoleVo;

import java.util.List;

/**
 * 平台角色信息表 服务类
 *
 * @author system
 * @since 2025-01-XX
 */
public interface StorePlatformRoleService extends IService<StorePlatformRole> {

    /**
     * 分页查询角色列表
     *
     * @param page     页码
     * @param size     页容
     * @param storeId  店铺ID
     * @param roleName 角色名称（支持模糊查询）
     * @param description 角色描述（支持模糊查询）
     * @param status   角色状态（0正常 1停用）
     * @return IPage<StorePlatformRole>
     */
    IPage<StorePlatformRole> getRolePage(int page, int size, Integer storeId, String roleName, String description, String status);

    /**
     * 分页查询角色列表（包含关联统计）
     *
     * @param page     页码
     * @param size     页容
     * @param storeId  店铺ID
     * @param roleName 角色名称（支持模糊查询）
     * @param description 角色描述（支持模糊查询）
     * @param status   角色状态（0正常 1停用）
     * @return IPage<StorePlatformRoleVo>
     */
    IPage<StorePlatformRoleVo> getRolePageWithStats(int page, int size, Integer storeId, String roleName, String description, String status);

    /**
     * 根据ID查询角色详情
     *
     * @param roleId 角色ID
     * @return StorePlatformRole
     */
    StorePlatformRole getRoleById(Long roleId);

    /**
     * 新增角色
     *
     * @param role 角色信息
     * @return 是否成功
     */
    boolean saveRole(StorePlatformRole role);

    /**
     * 创建角色（包含权限分配）
     *
     * @param role 角色信息
     * @param menuIds 菜单权限ID列表
     * @return 是否成功
     */
    boolean createRoleWithMenus(StorePlatformRole role, List<Long> menuIds);

    /**
     * 检查角色名称是否已存在
     *
     * @param storeId 店铺ID
     * @param roleName 角色名称
     * @param excludeRoleId 排除的角色ID（用于更新时排除自己）
     * @return 是否存在
     */
    boolean checkRoleNameExists(Integer storeId, String roleName, Long excludeRoleId);

    /**
     * 修改角色
     *
     * @param role 角色信息
     * @return 是否成功
     */
    boolean updateRole(StorePlatformRole role);

    /**
     * 更新角色（包含权限分配）
     * 如果角色类型（roleName）有变化，则更新 store_platform_role 表
     * 如果权限有变化，则更新 store_platform_role_menu 表
     *
     * @param role 角色信息
     * @param menuIds 菜单权限ID列表
     * @return 是否成功
     */
    boolean updateRoleWithMenus(StorePlatformRole role, List<Long> menuIds);

    /**
     * 删除角色（逻辑删除）
     *
     * @param roleId 角色ID
     * @return 是否成功
     */
    boolean deleteRole(Long roleId);

    /**
     * 逻辑删除角色
     * 如果角色有关联的子账号，则不允许删除
     *
     * @param roleId 角色ID
     * @return 删除结果信息，成功返回null，失败返回错误信息
     */
    String deleteRoleWithCheck(Long roleId);

    /**
     * 查询所有正常状态的角色列表
     *
     * @param storeId 店铺ID
     * @return List<StorePlatformRole>
     */
    List<StorePlatformRole> getAllNormalRoles(Integer storeId);
}

