package com.haha.admin.controller;

import cn.dev33.satoken.annotation.SaIgnore;
import cn.dev33.satoken.stp.StpUtil;
import com.haha.entity.dto.AdminLoginDTO;
import com.haha.admin.service.AdminLoginService;
import com.haha.common.annotation.Log;
import com.haha.common.enums.OperationType;
import com.haha.common.vo.AdminInfoVO;
import com.haha.common.vo.LoginVO;
import com.haha.common.vo.Result;
import lombok.RequiredArgsConstructor;
import java.util.Map;

import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

/**
 * 管理员登录控制器
 */
@Slf4j
@RequiredArgsConstructor
@RestController
@RequestMapping("/login")
public class AdminLoginController {

    private final AdminLoginService adminLoginService;
    
    /**
     * 管理员登录
     * @param loginDTO 登录请求参数
     * @return 登录结果,包含token和用户信息
     */
    @SaIgnore
    @Log(module = "系统登录", operation = OperationType.LOGIN, summary = "管理员登录")
    @PostMapping
    public Result<LoginVO> login(@RequestBody AdminLoginDTO loginDTO) {
        log.info("收到登录请求: username={}", loginDTO.getUsername());
        return adminLoginService.login(loginDTO.getUsername(), loginDTO.getPassword());
    }
    
    /**
     * 刷新令牌
     * @param body 包含 refreshToken 的请求体
     * @return 新的登录凭证
     */
    @SaIgnore
    @PostMapping("/refresh-token")
    public Result<LoginVO> refreshToken(@RequestBody Map<String, String> body) {
        String refreshToken = body.get("refreshToken");
        log.info("收到刷新令牌请求");
        return adminLoginService.refreshToken(refreshToken);
    }

    /**
     * 退出登录
     * @return 退出结果
     */
    @Log(module = "系统登录", operation = OperationType.LOGOUT, summary = "管理员退出登录")
    @PostMapping("/logout")
    public Result<Void> logout() {
        try {
            Object loginId = StpUtil.getLoginId();
            log.info("管理员退出登录: userId={}", loginId);
            StpUtil.logout();
            return Result.success("退出登录成功", null);
        } catch (Exception e) {
            log.error("退出登录异常: {}", e.getMessage(), e);
            return Result.error(500, "退出登录失败: " + e.getMessage());
        }
    }
    
    /**
     * 获取当前登录管理员信息
     * @return 管理员信息
     */
    @GetMapping("/info")
    public Result<AdminInfoVO> getInfo() {
        try {
            Object loginId = StpUtil.getLoginId();
            log.debug("获取管理员信息: userId={}", loginId);
            return adminLoginService.getAdminInfo(loginId.toString());
        } catch (Exception e) {
            log.error("获取管理员信息异常: {}", e.getMessage(), e);
            return Result.error(500, "获取信息失败: " + e.getMessage());
        }
    }
}
