package com.cpop.core.service;

import com.cpop.core.base.entity.LoginUser;
import com.cpop.core.base.enums.OperationLogEnum;
import com.cpop.core.base.enums.UserType;
import com.cpop.core.base.table.SysConfig;
import com.cpop.core.base.table.SysOperationLog;
import com.cpop.core.base.table.SysUser;
import org.springframework.security.core.userdetails.UserDetails;

import java.util.Map;

/**
 * @author DB
 * @Description:
 * @create: 2023-08-27 11:04
 */
public interface CoreService {

    /**
     * @Description: 添加操作日志
     * @param status 状态
     * @param loginUser 登陆用户
     * @param failReason 失败原因
     * @return String
     * @Author: DB
     * @Date: 2023/8/27 11:08
     */
    String insertOperationLog(Integer status, OperationLogEnum operationLogEnum, LoginUser loginUser, String failReason);

    /**
     * @Description: 添加操作日志
     * @param operationLog 日志
     * @return boolean
     * @Author: DB
     * @Date: 2023/8/29 23:46
     */
    boolean saveOperationLog(SysOperationLog operationLog);

    /**
     * @Description: 根据用户名获取用户信息
     * @param username 用户名
     * @return SysUser
     * @Author: DB
     * @Date: 2023/8/27 23:37
     */
    SysUser getSysUserByUsername(String username, UserType userType);

    /**
     * @Description: 更新登录地址
     * @param ipAddr ip地址
     * @param username 用户名
     * @author DB
     * @Date: 2023/8/28 0028 13:48
     */
    void updateSysUserLoginIp(String ipAddr, String username, UserType userType);

    /**
     * 根据键名查询参数配置信息
     *
     * @param configKey 参数键名
     * @return 参数键值
     */
    SysConfig selectConfigByKey(String configKey);

    /**
     * @Description: 新增参数配置
     * @param config
     * @author DB
     * @Date: 2023/6/7 0007 16:17
     */
    void insertConfig(SysConfig config);

    /**
     * @Description: 修改参数配置
     * @param config
     * @author DB
     * @Date: 2023/6/7 0007 16:19
     */
    void updateConfig(SysConfig config);

    /**
     * @Description: 批量删除参数信息
     * @param keys
     * @author DB
     * @Date: 2023/6/8 0008 9:58
     */
    void deleteConfigByKeys(String[] keys);

    /**
     * @descriptions 新增系统用户
     * @author DB
     * @date 2023/09/08 15:04
     * @param sysUser 系统用户参数
     */
    void insertSysUser(SysUser sysUser);

    /**
     * @descriptions 修改系统用户
     * @author DB
     * @date 2023/09/08 17:20
     * @param sysUser 系统用户参数
     */
    void updateSysUser(SysUser sysUser);

    /**
     * @descriptions 根据主键删除用户
     * @author DB
     * @date 2023/09/08 17:49
     * @param id 主键
     * @return void
     */
    void removeSysUserById(String id);

    /**
     * @descriptions 根据用户名与用户类型获取用户信息
     * @author DB
     * @date 2023/10/19 9:57
     * @param userName 用户名
     * @param userType 用户类型
     * @return 登陆用户
     */
    LoginUser loadUserByUsername(String userName, UserType userType);

    /**
     * @descriptions 根据手机号与用户类型获取用户信息
     * @author DB
     * @date 2023/10/19 9:57
     * @param phoneNumber 手机号
     * @param userType 用户类型
     * @return 登陆用户
     */
    LoginUser loadUserByPhone(String phoneNumber, UserType userType);

    /**
     * @descriptions 根据手机号与用户类型获取用户信息
     * @author DB
     * @date 2023/10/19 9:57
     * @param phoneNumber 手机号
     * @param userType 用户类型
     * @return 登陆用户
     */
    LoginUser loadUserByPhone(String phoneNumber, UserType userType, Map<String, Object> credentials);

    /**
     * @Description: 根据用户名获取用户信息
     * @param phoneNumber 手机号
     * @return SysUser
     * @Author: DB
     * @Date: 2023/8/27 23:37
     */
    SysUser getSysUserByPhone(String phoneNumber, UserType userType);

    /**
     * @descriptions 检查用户是否存在
     * @author DB
     * @date 2023/11/10 11:57
     * @param username 用户名
     * @param id 主键
     * @param userType 用户类型
     * @return: void
     */
    void isAccountExist(String username, String id, String userType);
}
