package com.haha.miniapp.controller;

import cn.dev33.satoken.stp.StpUtil;
import com.haha.common.constant.ResponseEnum;
import com.haha.common.vo.OpenDoorVO;
import com.haha.common.vo.Result;
import com.haha.entity.dto.ScanOpenDTO;
import com.haha.service.DeviceService;
import com.haha.service.LayerTemplateService;
import com.haha.sdk.exception.HahaException;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

import java.util.Map;

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

    private final DeviceService deviceService;
    private final LayerTemplateService layerTemplateService;

    /**
     * 处理小程序扫码开门
     *
     * @param dto 包含 deviceId（设备ID）
     * @return 操作结果
     */
    @PostMapping("/scan-open")
    public Result<OpenDoorVO> scanOpen(@RequestBody ScanOpenDTO dto) {
        // 1. 参数校验
        String deviceId = dto.getDeviceId();
        if (deviceId == null || deviceId.trim().isEmpty()) {
            return ResponseEnum.PARAM_REQUIRED.toResult("参数错误：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 ResponseEnum.OPERATION_FAILED.toResult("系统繁忙，请稍后重试");
        }
    }

    /**
     * 获取设备商品陈列信息
     * 根据设备ID查询层模板，返回每层商品数据供小程序展示
     *
     * @param deviceId 设备ID（SN号）
     * @return 商品陈列数据
     */
    @GetMapping("/products/{deviceId}")
    public Result<Map<String, Object>> getDeviceProducts(@PathVariable String deviceId) {
        try {
            Map<String, Object> result = layerTemplateService.getDeviceProducts(deviceId);
            if (result == null) {
                return ResponseEnum.DEVICE_NO_PRODUCTS.toResult();
            }
            return Result.success("查询成功", result);
        } catch (Exception e) {
            log.error("查询设备商品信息异常, deviceId={}", deviceId, e);
            return Result.error(500, "查询失败，请稍后重试");
        }
    }

    private String getErrorMessage(Integer errorCode, String defaultMsg) {
        return deviceService.getHahaErrorMessage(errorCode, defaultMsg);
    }
}
