package com.vetti.hotake.service;

import com.vetti.hotake.domain.HotakeSecuritySettings;
import com.vetti.hotake.domain.dto.SecurityChangePasswordDto;
import com.vetti.hotake.domain.vo.SecuritySessionVo;
import com.vetti.hotake.domain.vo.SecurityTrustedDeviceVo;

import java.util.List;

/**
 * 安全设置Service接口
 *
 * @author vetti
 * @date 2026-02-02
 */
public interface IHotakeSecurityService
{
    /**
     * 获取当前用户的安全设置
     * 如果不存在则自动创建默认设置
     *
     * @return 安全设置
     */
    HotakeSecuritySettings getCurrentUserSecuritySettings();

    /**
     * 更新两步验证设置
     *
     * @param enabled 是否启用
     * @return 结果
     */
    int updateTwoFactorEnabled(boolean enabled);

    /**
     * 修改密码
     *
     * @param dto 修改密码DTO
     * @return 结果
     */
    void changePassword(SecurityChangePasswordDto dto);

    /**
     * 获取当前用户的活跃会话列表
     *
     * @return 会话列表
     */
    List<SecuritySessionVo> getActiveSessions();

    /**
     * 终止指定会话
     *
     * @param sessionId 会话ID
     * @return 结果
     */
    int terminateSession(Long sessionId);

    /**
     * 终止所有其他会话（除了当前会话）
     *
     * @return 结果
     */
    int terminateAllOtherSessions();

    /**
     * 记录登录会话
     *
     * @param userId 用户ID
     * @param sessionToken 会话令牌
     * @param ipAddress IP地址
     * @param userAgent 用户代理
     * @return 结果
     */
    int recordLoginSession(Long userId, String sessionToken, String ipAddress, String userAgent);

    /**
     * 更新会话活动时间
     *
     * @param sessionToken 会话令牌
     * @return 结果
     */
    int updateSessionActivity(String sessionToken);

    /**
     * 记录安全日志
     *
     * @param userId 用户ID
     * @param eventType 事件类型
     * @param eventDescription 事件描述
     * @param status 状态
     * @return 结果
     */
    int recordSecurityLog(Long userId, String eventType, String eventDescription, String status);

    /**
     * 更新会话为已登出状态
     *
     * @param sessionToken 会话令牌
     * @return 结果
     */
    int updateSessionLogout(String sessionToken);

    /**
     * 获取当前用户的可信设备列表
     *
     * @return 可信设备列表
     */
    List<SecurityTrustedDeviceVo> getTrustedDevices();

    /**
     * 添加可信设备
     *
     * @param deviceId 设备唯一标识
     * @param deviceName 设备名称
     * @return 结果
     */
    int addTrustedDevice(String deviceId, String deviceName);

    /**
     * 移除可信设备
     *
     * @param id 设备记录ID
     * @return 结果
     */
    int removeTrustedDevice(Long id);

    /**
     * 检查设备是否为可信设备
     *
     * @param userId 用户ID
     * @param deviceId 设备唯一标识
     * @return 是否可信
     */
    boolean isTrustedDevice(Long userId, String deviceId);
}
