package com.sonic.bear.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.sonic.bear.domain.input.KickOutInput;
import com.sonic.bear.domain.input.LogoutInput;
import com.sonic.common.auth.domains.Session;
import com.sonic.bear.domain.entity.UserSession;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.util.Optional;

/**
 * @author coder
 */
public interface UserSessionService extends IService<UserSession> {

    /**
     * 创建一个 Session
     * @param param
     * @return
     */
    Session createSession(CreateSessionReq param);

    /**
     * 验证token是否有效
     * @param token session 令牌
     * @return 有效的 session，无效则抛出异常
     */
    Session touchSession(String token);

    /**
     * 退出登录。
     * 1.更新session状态
     * 2.更新loginToken状态
     * 3.使session缓存过期
     * @param input
     */
    void logout(LogoutInput input);

    /**
     * 根据 token 查询 UserSession
     * @param token
     * @return
     */
    Optional<UserSession> get(String token);

    /**
     * 踢下线
     * @param input
     */
    void kickOut(KickOutInput input);

    @Data
    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    class CreateSessionReq {
        @NotNull(message = "{YOU_HAVE_TO_ENTER_YOUR_ACCOUNT}")
        private Long userId;
        @NotBlank(message = "{YOU_HAVE_TO_SPECIFY_THE_LOGIN_CLIENT}")
        private String clientCode;
        private String deviceId;
        private String ip;
        /**
         * 登录类型（三方账号、账号密码、手机号验证码 等）
         */
        private String loginType;
        /**
         * 客户端设备基础信息
         */
        private String userAgent;
    }


}
