package com.dora.service;

import com.dora.dto.AuthDto;
import com.dora.entity.User;

/**
 * 用户服务接口
 */
public interface UserService {

    /**
     * 短信验证码登录
     * @param phone 手机号
     * @param code 验证码
     * @return 登录响应
     */
    AuthDto.LoginResponse smsLogin(String phone, String code);

    /**
     * 密码登录
     * @param phone 手机号
     * @param password 密码
     * @return 登录响应
     */
    AuthDto.LoginResponse passwordLogin(String phone, String password);

    /**
     * 用户注册
     * @param phone 手机号
     * @param code 验证码
     * @param password 密码（可选，为空时用户只能使用短信验证码登录）
     * @param inviteCode 邀请码（可选）
     * @return 注册响应
     */
    AuthDto.LoginResponse register(String phone, String code, String password, String inviteCode);

    /**
     * 根据ID获取用户信息
     * @param userId 用户ID
     * @return 用户信息
     */
    User getUserById(Long userId);

    /**
     * 根据手机号获取用户信息
     * @param phone 手机号
     * @return 用户信息
     */
    User getUserByPhone(String phone);

    /**
     * 根据用户名获取用户信息
     * @param username 用户名
     * @return 用户信息
     */
    User getUserByUsername(String username);

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

    /**
     * 更新用户信息
     * @param userId 用户ID
     * @param username 用户昵称
     * @param avatarUrl 头像URL
     * @return 更新结果
     */
    boolean updateProfile(Long userId, String username, String avatarUrl);

    /**
     * 更新用户名
     * @param userId 用户ID
     * @param newUsername 新用户名
     * @return 更新结果
     */
    boolean updateUsername(Long userId, String newUsername);

    /**
     * 忘记密码重置
     * @param phone 手机号
     * @param code 验证码
     * @param newPassword 新密码
     * @return 更新结果
     */
    boolean resetPassword(String phone, String code, String newPassword);

    /**
     * 检查用户名是否可用
     * @param username 用户名
     * @return 是否可用
     */
    boolean isUsernameAvailable(String username);

    /**
     * 生成推广码
     * @return 推广码
     */
    String generateInviteCode();

    /**
     * 更新用户实名认证状态
     * @param userId 用户ID
     * @param isVerified 认证状态
     * @return 更新结果
     */
    boolean updateVerificationStatus(Long userId, Integer isVerified);

    /**
     * 更新用户真实身份信息
     * @param userId 用户ID
     * @param realUsername 真实用户名
     * @param idNumber 身份证号码
     * @return 更新结果
     */
    boolean updateRealIdentity(Long userId, String realUsername, String idNumber);

    /**
     * 获取用户真实身份信息
     * @param userId 用户ID
     * @return 真实身份信息响应
     */
    AuthDto.RealIdentityResponse getRealIdentity(Long userId);

    /**
     * 更新用户手机号
     * @param userId 用户ID
     * @param newPhone 新手机号
     * @param code 验证码
     * @return 更新结果
     */
    boolean updatePhone(Long userId, String newPhone, String code);

    /**
     * 修改密码（需要验证码）
     * @param phone 手机号
     * @param code 验证码
     * @param newPassword 新密码
     * @return 更新结果
     */
    boolean updatePasswordWithCode(String phone, String code, String newPassword);

    /**
     * 验证当前用户密码
     * @param userId 用户ID
     * @param password 当前密码
     * @return 验证结果
     */
    boolean verifyCurrentPassword(Long userId, String password);

    /**
     * 根据微信openid获取用户信息
     * @param wechatOpenid 微信openid
     * @return 用户信息
     */
    User getUserByWechatOpenid(String wechatOpenid);

    /**
     * 根据推广码获取用户信息
     * @param inviteCode 推广码
     * @return 用户信息
     */
    User getUserByInviteCode(String inviteCode);

    /**
     * 微信扫码登录
     * @param wechatOpenid 微信openid
     * @param sceneStr 场景值（支持推广码）
     * @return 登录响应
     */
    AuthDto.LoginResponse wechatLogin(String wechatOpenid, String sceneStr);
    
    /**
     * 微信扫码登录（向下兼容）
     * @param wechatOpenid 微信openid
     * @return 登录响应
     */
    default AuthDto.LoginResponse wechatLogin(String wechatOpenid) {
        return wechatLogin(wechatOpenid, null);
    }

    /**
     * 绑定微信账号
     * @param userId 用户ID
     * @param wechatOpenid 微信openid
     * @return 绑定结果
     */
    boolean bindWechatAccount(Long userId, String wechatOpenid);
} 