package com.emotion.service;

import com.emotion.dto.request.LoginRequest;
import com.emotion.dto.request.RegisterRequest;
import com.emotion.dto.request.ResetPasswordRequest;
import com.emotion.dto.response.ResetPasswordResponse;

import com.emotion.dto.response.AuthResponse;
import com.emotion.dto.response.CaptchaResponse;
import com.emotion.dto.response.SmsCodeResponse;
import com.emotion.dto.response.UserInfoResponse;

import javax.servlet.http.HttpServletRequest;

/**
 * 认证服务接口
 *
 * @author huazhongmin
 * @date 2025-07-23
 */
public interface AuthService {

    /**
     * 用户登录
     *
     * @param request 登录请求
     * @return 认证响应
     */
    AuthResponse login(LoginRequest request);

    /**
     * 用户注册
     *
     * @param request 注册请求
     * @return 认证响应
     */
    /**
     * 重置密码（手机号 + 验证码）
     *
     * @param request 重置密码请求
     * @return 重置密码响应
     */
    ResetPasswordResponse resetPassword(ResetPasswordRequest request);

    AuthResponse register(RegisterRequest request);

    /**
     * 获取当前用户信息
     *
     * @param userId 用户ID
     * @return 用户信息响应
     */
    UserInfoResponse getCurrentUserInfo(String userId);

    /**
     * 生成验证码
     *
     * @return 验证码响应
     */
    CaptchaResponse generateCaptcha();

    /**
     * 验证验证码
     *
     * @param captchaKey 验证码key
     * @param captcha    验证码
     * @return 是否验证成功
     */
    boolean validateCaptcha(String captchaKey, String captcha);

    /**
     * 用户登出
     *
     * @param userId 用户ID
     * @param token 访问令牌
     * @return 是否登出成功
     */
    boolean logout(String userId, String token);

    /**
     * 用户登出（通过请求）
     *
     * @param request HTTP请求
     * @return 是否登出成功
     */
    boolean logoutByToken(HttpServletRequest request);

    /**
     * 刷新访问令牌
     *
     * @param refreshToken 刷新令牌
     * @return 新的认证响应
     */
    AuthResponse refreshToken(String refreshToken);

    /**
     * 验证访问令牌
     *
     * @param request HTTP请求
     * @return 是否有效
     */
    boolean validateToken(HttpServletRequest request);

    /**
     * 验证访问令牌
     *
     * @param token 访问令牌
     * @return 是否有效
     */
    boolean validateToken(String token);

    /**
     * 从令牌中获取用户ID
     *
     * @param token 访问令牌
     * @return 用户ID
     */
    String getUserIdFromToken(String token);

    /**
     * 从令牌中获取用户名
     *
     * @param token 访问令牌
     * @return 用户名
     */
    String getUsernameFromToken(String token);

    /**
     * 检查账号是否存在
     *
     * @param account 账号
     * @return 是否存在
     */
    boolean existsByAccount(String account);

    /**
     * 检查邮箱是否存在
     *
     * @param email 邮箱
     * @return 是否存在
     */
    boolean existsByEmail(String email);

    /**
     * 检查手机号是否存在
     *
     * @param phone 手机号
     * @return 是否存在
     */
    boolean existsByPhone(String phone);

    /**
     * 发送短信验证码
     *
     * @param phone 手机号
     * @return 短信验证码响应
     */
    SmsCodeResponse sendSmsCode(String phone);

    /**
     * 验证短信验证码
     *
     * @param phone 手机号
     * @param code 验证码
     * @return 是否验证成功
     */
    boolean validateSmsCode(String phone, String code);
}