package com.example.demo.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.Map;

/**
 * 学习示例控制器
 * 
 * 学习点：
 * - 各种参数接收方式
 * - 配置注入
 * - 响应格式
 */
@RestController
public class LearnController {

    // 从配置文件注入值
    @Value("${spring.application.name:demo}")
    private String appName;

    /**
     * 根路径 - 重定向到学习中心
     */
    @GetMapping("/")
    public Map<String, Object> root() {
        Map<String, Object> info = new HashMap<>();
        info.put("message", "欢迎来到 Spring Boot 学习脚手架！");
        info.put("learn", "https://spring.xiaoxiaoluohao.indevs.in/learn");
        info.put("aop", "https://spring.xiaoxiaoluohao.indevs.in/aop");
        info.put("api", "https://spring.xiaoxiaoluohao.indevs.in/api/users");
        return info;
    }

    // GET /learn - API 信息
    @GetMapping("/learn")
    public Map<String, Object> info() {
        Map<String, Object> info = new HashMap<>();
        info.put("app", appName);
        info.put("message", "欢迎学习 Spring Boot！");
        info.put("endpoints", new String[]{
            "GET  /learn/params?name=xxx&age=18 - 参数示例",
            "POST /learn/body - JSON 请求体示例",
            "GET  /learn/path/{id} - 路径变量示例",
            "GET  /learn/header - 请求头示例",
            "GET  /learn/cookie - Cookie 示例"
        });
        return info;
    }

    // GET /learn/params?name=xxx&age=18 - 查询参数
    @GetMapping("/learn/params")
    public Map<String, Object> params(
            @RequestParam(required = false, defaultValue = "游客") String name,
            @RequestParam(required = false, defaultValue = "0") Integer age
    ) {
        Map<String, Object> result = new HashMap<>();
        result.put("name", name);
        result.put("age", age);
        result.put("tip", "使用 @RequestParam 接收查询参数");
        return result;
    }

    // POST /learn/body - 请求体
    @PostMapping("/learn/body")
    public Map<String, Object> body(@RequestBody Map<String, Object> data) {
        Map<String, Object> result = new HashMap<>();
        result.put("received", data);
        result.put("tip", "使用 @RequestBody 接收 JSON 请求体");
        return result;
    }

    // GET /learn/path/{id} - 路径变量
    @GetMapping("/learn/path/{id}")
    public Map<String, Object> path(@PathVariable String id) {
        Map<String, Object> result = new HashMap<>();
        result.put("id", id);
        result.put("tip", "使用 @PathVariable 接收路径变量");
        return result;
    }

    // GET /learn/header - 请求头
    @GetMapping("/learn/header")
    public Map<String, Object> header(@RequestHeader(value = "User-Agent", required = false) String userAgent) {
        Map<String, Object> result = new HashMap<>();
        result.put("userAgent", userAgent);
        result.put("tip", "使用 @RequestHeader 获取请求头");
        return result;
    }

    // GET /learn/cookie - Cookie
    @GetMapping("/learn/cookie")
    public Map<String, Object> cookie(@CookieValue(value = "JSESSIONID", required = false) String sessionId) {
        Map<String, Object> result = new HashMap<>();
        result.put("sessionId", sessionId);
        result.put("tip", "使用 @CookieValue 获取 Cookie");
        return result;
    }

    // GET /learn/exception - 异常处理
    @GetMapping("/learn/exception")
    public String exception() {
        throw new RuntimeException("这是一个测试异常");
    }

    // 全局异常处理
    @ExceptionHandler(RuntimeException.class)
    public Map<String, Object> handleException(RuntimeException e) {
        Map<String, Object> result = new HashMap<>();
        result.put("error", e.getMessage());
        result.put("tip", "使用 @ExceptionHandler 处理异常");
        return result;
    }
}