package dev.awesomedev.mirim.web;

import dev.awesomedev.mirim.domain.User;
import dev.awesomedev.mirim.service.AuthService;
import dev.awesomedev.mirim.service.StudentProfileService;
import dev.awesomedev.mirim.web.dto.ProfileResponse;
import dev.awesomedev.mirim.web.dto.ProfileUpdateRequest;
import jakarta.validation.Valid;
import org.springframework.security.core.Authentication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * 이 파일이 하는 일:
 * "내 정보" API — 본인 인적사항 조회(GET)와 수정(PUT).
 *
 * 학습 포인트: 경로에 사용자 id가 없다(/api/profile/me).
 * "누구의 정보인가"를 URL이 아니라 로그인 세션에서 얻기 때문에,
 * 남의 id를 넣어 남의 정보를 조회·수정하는 공격(IDOR)이 원천적으로 불가능하다.
 * — URL에 /users/{id}/profile 처럼 id를 받는 설계였다면 매번 "본인인가?"를 검사해야 했다.
 */
@RestController
@RequestMapping("/api/profile")
public class ProfileController {

    private final AuthService authService;
    private final StudentProfileService studentProfileService;

    public ProfileController(AuthService authService, StudentProfileService studentProfileService) {
        this.authService = authService;
        this.studentProfileService = studentProfileService;
    }

    /** GET /api/profile/me — 내 인적사항 */
    @GetMapping("/me")
    public ProfileResponse myProfile(Authentication authentication) {
        User user = authService.requireUser(authentication);
        return studentProfileService.myProfile(user);
    }

    /**
     * PUT /api/profile/me — 내 인적사항 수정.
     * 학습 포인트: 부분 수정이 아니라 전체 교체라서 PUT이다(PATCH가 아니라).
     * 화면이 현재 값을 전부 채워서 보내므로 "빠진 필드 = 지워짐" 혼란이 없다.
     */
    @PutMapping("/me")
    public ProfileResponse updateMyProfile(@Valid @RequestBody ProfileUpdateRequest request,
                                           Authentication authentication) {
        User user = authService.requireUser(authentication);
        return studentProfileService.updateMyProfile(user, request);
    }
}
