package com.haha.miniapp.controller;

import cn.dev33.satoken.stp.StpUtil;
import com.haha.common.vo.OpenDoorVO;
import com.haha.common.vo.Result;
import com.haha.service.DeviceService;
import com.haha.sdk.exception.HahaException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Map;

/**
 * 设备控制相关接口
 * Controller层仅负责接收请求、参数校验、调用Service、返回响应
 */
@Slf4j
@RestController
@RequestMapping("/device")
public class DeviceController {

    @Autowired
    private DeviceService deviceService;

    /**
     * 处理小程序扫码开门
     *
     * @param params 包含 deviceId（设备ID）
     * @return 操作结果
     */
    @PostMapping("/scan-open")
    public Result<OpenDoorVO> scanOpen(@RequestBody Map<String, String> params) {
        // 1. 参数校验
        String deviceId = params.get("deviceId");
        if (deviceId == null || deviceId.trim().isEmpty()) {
            return Result.error(400, "参数错误：deviceId 不能为空");
        }

        try {
            // 2. 获取用户信息
            Long userId = StpUtil.getLoginIdAsLong();
            log.info("用户 {} 扫码请求打开设备 {}", userId, deviceId);

            // 3. 调用Service层处理业务逻辑
            OpenDoorVO result = deviceService.scanOpenDoor(deviceId, userId);
            return Result.success("开门成功，请取货", result);
            
        } catch (cn.dev33.satoken.exception.NotLoginException e) {
            // 捕获 Sa-Token 未登录异常
            log.warn("用户未登录或token无效，设备: {}, 错误类型: {}, 错误信息: {}", 
                deviceId, e.getType(), e.getMessage());
            return Result.error(401, "登录已失效，请重新登录");
            
        } catch (Exception e) {
            // 处理其他异常
            log.error("开门异常", e);
            
            // 判断是否为SDK异常
            if (e instanceof HahaException) {
                HahaException hahaEx = (HahaException) e;
                String message = getErrorMessage(hahaEx.getErrorCode(), hahaEx.getMessage());
                return Result.error(500, message);
            }
            
            return Result.error(500, "系统繁忙，请稍后重试");
        }
    }

    /**
     * 根据错误码返回友好的错误信息
     */
    private String getErrorMessage(Integer errorCode, String defaultMsg) {
        if (errorCode == null) {
            return defaultMsg != null ? defaultMsg : "操作失败";
        }
        
        switch (errorCode) {
            case -1:
                return "参数错误，请检查设备ID是否正确";
            case -2:
                return "签名错误，请联系技术支持";
            case -3:
            case -4:
                return "认证失败，请稍后重试";
            case -100:
                return "设备不存在，请确认设备ID";
            case -101:
                return "设备离线，请稍后再试";
            case -102:
                return "设备故障，请联系设备维护人员";
            case -103:
                return "设备使用中，请稍后再试";
            default:
                return defaultMsg != null ? defaultMsg : "开门失败";
        }
    }
}
