package com.corewing.app.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.corewing.app.common.Result;
import com.corewing.app.dto.CodeLoginRequest;
import com.corewing.app.dto.ForgetPasswordRequest;
import com.corewing.app.dto.LogoffRequest;
import com.corewing.app.entity.User;

import java.util.Map;


/**
 * 应用用户 Service 接口
 */
public interface UserService extends IService<User> {

    /**
     * 获取用户分页数据
     * @param user
     * @return
     */
    Page<User> page(User user);

    /**
     * 新增用户数据
     * @param user
     * @return
     */
    boolean save(User user);

    /**
     * 更新用户数据
     * @param user
     * @return
     */
    boolean update(User user);

    /**
     * 根据用户名查询用户
     *
     * @param username 用户名
     * @return 用户信息
     */
    User getByUsername(String username);

    /**
     * 根据账号查询用户（支持用户名/邮箱/手机号）
     *
     * @param account 账号
     * @return 用户信息
     */
    User getByAccount(String account);

    /**
     * 根据邮箱查询用户
     *
     * @param email 邮箱
     * @return 用户信息
     */
    User getByEmail(String email);

    /**
     * 根据手机号查询用户
     *
     * @param telephone 手机号
     * @return 用户信息
     */
    User getByTelephone(String telephone);

    /**
     * 用户登录
     *
     * @param account  账号（用户名/邮箱/手机号）
     * @param password 密码
     * @return token
     */
    String login(String account, String password);

    /**
     * 用户注册
     *
     * @param user 用户信息
     * @param code 验证码
     * @param registerIp 注册IP
     * @return 是否成功
     */
    boolean register(User user, String code, String registerIp);

    /**
     * 更新登录IP
     *
     * @param userId  用户ID
     * @param loginIp 登录IP
     */
    void updateLoginIp(Long userId, String loginIp);

    /**
     * 更新登录信息（IP和归属地）
     *
     * @param userId  用户ID
     * @param loginIp 登录IP
     */
    void updateLoginInfo(Long userId, String loginIp);


    /**
     * 忘记密码
     * @param request
     * @return
     */
    boolean forgetPassword(ForgetPasswordRequest request);

    /**
     * 验证码登录
     * @param codeLoginRequest
     * @return
     */
    String codeLogin(CodeLoginRequest codeLoginRequest);

    /**
     * 注销用户
     * @param logoffRequest
     * @return
     */
    boolean logoff(LogoffRequest logoffRequest);

    /**
     * 删除发送验证码
     * @return
     */
    Result<Map<String, String>> deleteSendCode();
}
