package dev.awesomedev.mirim.web;

import dev.awesomedev.mirim.domain.User;
import dev.awesomedev.mirim.service.AuthService;
import dev.awesomedev.mirim.service.CourseProgressService;
import org.springframework.http.HttpStatus;
import org.springframework.security.core.Authentication;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.server.ResponseStatusException;

import java.util.List;
import java.util.Map;

/**
 * 이 파일이 하는 일:
 * 학습 센터 코스 완료(진도) API — 내 완료 목록 조회, 완료 토글.
 * ProgressController(체크리스트)와 같은 구조다.
 */
@RestController
@RequestMapping("/api/course-progress")
public class CourseProgressController {

    private final CourseProgressService courseProgressService;
    private final AuthService authService;

    public CourseProgressController(CourseProgressService courseProgressService,
                                    AuthService authService) {
        this.courseProgressService = courseProgressService;
        this.authService = authService;
    }

    /** GET /api/course-progress/me — 내가 완료한 코스 slug 배열 */
    @GetMapping("/me")
    public List<String> myCompleted(Authentication authentication) {
        User user = authService.requireUser(authentication);
        return courseProgressService.completedSlugs(user);
    }

    /** POST /api/course-progress/{slug}/toggle — 완료 상태 뒤집기 */
    @PostMapping("/{slug}/toggle")
    public Map<String, Object> toggle(@PathVariable String slug, Authentication authentication) {
        User user = authService.requireUser(authentication);
        // 학습 포인트: slug는 프론트 카탈로그에만 있는 값이라 서버가 목록 검증은 못 하지만,
        // 형식(소문자·숫자·하이픈, 60자 이내)은 검사해서 이상한 값이 쌓이는 것을 막는다.
        if (!slug.matches("[a-z0-9-]{1,60}")) {
            throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "잘못된 코스 주소입니다.");
        }
        boolean completed = courseProgressService.toggle(user, slug);
        return Map.of("slug", slug, "completed", completed);
    }
}
