package shop.alien.storeplatform.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import shop.alien.entity.result.R;
import shop.alien.entity.store.StorePlatformUserRole;
import shop.alien.entity.store.vo.SubAccountDetailVo;
import shop.alien.entity.store.vo.SubAccountListVo;
import shop.alien.entity.store.vo.SubAccountVo;

import java.util.List;

/**
 * 用户角色关联表 服务类
 *
 * @author system
 * @since 2025-01-XX
 */
public interface StorePlatformUserRoleService extends IService<StorePlatformUserRole> {

    /**
     * 根据用户ID查询角色ID列表
     *
     * @param userId  用户ID
     * @param storeId 店铺ID
     * @return 角色ID列表
     */
    List<Long> getRoleIdsByUserId(Integer userId, Integer storeId);

    /**
     * 根据角色ID查询用户ID列表
     *
     * @param roleId  角色ID
     * @param storeId 店铺ID
     * @return 用户ID列表
     */
    List<Integer> getUserIdsByRoleId(Long roleId, Integer storeId);

    /**
     * 为用户分配角色
     *
     * @param userId  用户ID
     * @param roleIds 角色ID列表
     * @param storeId 店铺ID
     * @return 是否成功
     */
    boolean assignRoles(Integer userId, List<Long> roleIds, Integer storeId);

    /**
     * 移除用户的所有角色
     *
     * @param userId  用户ID
     * @param storeId 店铺ID
     * @return 是否成功
     */
    boolean removeAllRoles(Integer userId, Integer storeId);

    /**
     * 移除用户的指定角色
     *
     * @param userId  用户ID
     * @param roleId  角色ID
     * @param storeId 店铺ID
     * @return 是否成功
     */
    boolean removeRole(Integer userId, Long roleId, Integer storeId);

    /**
     * 根据手机号创建账号并分配角色
     * 如果 store_user 表中没有该手机号的记录，则插入一条数据
     * 如果 store_platform_user_role 表中没有该用户和店铺的角色记录，则插入数据
     *
     * @param phone       手机号
     * @param accountName 账号名称
     * @param storeId     店铺ID
     * @param roleId      角色ID
     * @return 是否成功
     */
    R<String> createAccountAndAssignRole(String phone, String accountName, Integer storeId, Long roleId);

    /**
     * 查询当前店铺下的子账号列表
     * 根据店铺ID查询 store_platform_user_role 表连表 store_user 和 store_platform_role
     * 支持根据账号名称、手机号、角色名称进行模糊查询
     * 并计算每个子账号的权限数量
     *
     * @param storeId    店铺ID
     * @param accountName 账号名称（模糊查询）
     * @param phone       手机号（模糊查询）
     * @param roleName    角色名称（模糊查询）
     * @return 子账号列表
     */
    List<SubAccountVo> querySubAccounts(Integer storeId, String accountName, String phone, String roleName);

    /**
     * 根据用户ID和店铺ID查询子账号详情（用于编辑账号页面）
     * 包含账号基本信息、角色信息和权限列表
     *
     * @param userId  用户ID
     * @param storeId 店铺ID
     * @return 子账号详情
     */
    SubAccountDetailVo getSubAccountDetail(Integer userId, Integer storeId, Long roleIdNew);

    /**
     * 批量逻辑删除子账号（删除用户角色关联关系）
     *
     * @param userIds 用户ID列表
     * @param storeId 店铺ID
     * @return 是否成功
     */
    boolean batchDeleteSubAccounts(List<Integer> userIds, Integer storeId);

    /**
     * 更新子账号信息（账号名、手机号和角色信息）
     *
     * @param userId      用户ID
     * @param phone       手机号（可选）
     * @param accountName 账号名称（可选）
     * @param storeId     店铺ID
     * @param roleId      角色ID（可选）
     * @return 是否成功
     */
    boolean updateSubAccount(Integer userId, String phone, String accountName, Integer storeId, Long roleId);

    boolean updateSubAccountNew(Integer userId, String phone, String accountName, Integer storeId, Long roleId,Integer id);

    /**
     * 查询所有子账号信息（包含主账号电话）- 分页查询
     * 查询 store_platform_user_role 表中所有的数据
     * 主账号电话通过 store_id 关联 store_user 表查询
     * 联系电话通过 user_id 关联 store_user 表查询
     *
     * @param pageNum   页码
     * @param pageSize  每页大小
     * @param mainAccountId 账号ID（主账号ID或子账号用户ID，模糊查询）
     * @param phone     联系电话（子账号电话，模糊查询）
     * @param status    状态（精确查询）
     * @return 子账号分页列表
     */
    IPage<SubAccountListVo> queryAllSubAccounts(Integer pageNum, Integer pageSize, String mainAccountId, String phone, Integer status);

    /**
     * 更新子账号状态
     * 根据传入的 status 值更新 store_platform_user_role 表中指定记录的 status 字段
     * status 为 0 表示启用，status 为 1 表示禁用
     *
     * @param id 子账号关联记录的主键ID
     * @param status 状态值（0启用 1禁用）
     * @return 是否成功
     */
    boolean disableSubAccount(Long id, Integer status);
}

