// ============================================================
//  Spring Boot 3 + springdoc-openapi 最小可运行示例
//  访问: http://localhost:8080/swagger-ui.html
// ============================================================

package com.example.demo;

import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
import jakarta.validation.Valid;
import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Size;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.concurrent.atomic.AtomicLong;
import java.util.concurrent.ConcurrentHashMap;
import java.util.Map;

@RestController
@RequestMapping("/users")
@Tag(name = "用户管理", description = "用户的 CRUD")
public class UserController {

    private final Map<Long, User> store = new ConcurrentHashMap<>();
    private final AtomicLong idGen = new AtomicLong(1);

    @GetMapping
    @Operation(summary = "用户列表", operationId = "listUsers")
    public List<User> list(
        @Parameter(description = "页码（从 1 开始）") @RequestParam(defaultValue = "1") int page,
        @Parameter(description = "每页大小") @RequestParam(defaultValue = "20") int size) {
        return store.values().stream()
            .skip((long)(page - 1) * size)
            .limit(size)
            .toList();
    }

    @GetMapping("/{id}")
    @Operation(summary = "查单条", operationId = "getUser")
    @ApiResponses({
        @ApiResponse(responseCode = "200", description = "成功"),
        @ApiResponse(responseCode = "404", description = "用户不存在")
    })
    public ResponseEntity<User> get(@PathVariable Long id) {
        User u = store.get(id);
        return u == null ? ResponseEntity.notFound().build() : ResponseEntity.ok(u);
    }

    @PostMapping
    @Operation(summary = "创建用户", operationId = "createUser",
               security = @SecurityRequirement(name = "bearerAuth"))
    @ApiResponse(responseCode = "201", description = "创建成功")
    public ResponseEntity<User> create(@Valid @RequestBody UserCreate body) {
        long id = idGen.getAndIncrement();
        User u = new User(id, body.name, body.email);
        store.put(id, u);
        return ResponseEntity.status(HttpStatus.CREATED).body(u);
    }

    @DeleteMapping("/{id}")
    @Operation(summary = "删除用户", operationId = "deleteUser",
               security = @SecurityRequirement(name = "bearerAuth"))
    @ApiResponse(responseCode = "204", description = "已删除")
    public ResponseEntity<Void> delete(@PathVariable Long id) {
        return store.remove(id) != null
            ? ResponseEntity.noContent().build()
            : ResponseEntity.notFound().build();
    }

    // ---------------- DTO ----------------

    @Schema(description = "用户")
    public record User(
        @Schema(description = "ID", example = "1") Long id,
        @Schema(description = "姓名", example = "Alice") String name,
        @Schema(description = "邮箱", example = "alice@x.com") String email
    ) {}

    @Schema(description = "创建用户请求体")
    public static class UserCreate {
        @Schema(description = "姓名", example = "Alice", required = true)
        @NotBlank @Size(max = 50)
        public String name;

        @Schema(description = "邮箱", example = "alice@x.com", required = true)
        @Email @NotBlank
        public String email;
    }
}
