package com.zioinfo.kintex.auth;

import com.zioinfo.kintex.auth.dto.ForgotPasswordRequest;
import com.zioinfo.kintex.auth.dto.MessageResponse;
import com.zioinfo.kintex.auth.dto.RegisterRequest;
import com.zioinfo.kintex.auth.dto.RegisterResponse;
import com.zioinfo.kintex.auth.dto.ResetPasswordRequest;
import com.zioinfo.kintex.common.ApiResponse;
import jakarta.validation.Valid;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * 공개 인증 API (C-1) — 회원가입·비밀번호 찾기/초기화. 전부 공개(SecurityConfig permitAll).
 * <p>기존 {@link AuthController}(로그인·워크스페이스)·Phase B(2FA) 는 건드리지 않고 본 컨트롤러만 추가한다.
 * 응답은 표준 {@link ApiResponse} 봉투를 쓰며 비밀번호·재설정 코드·해시는 절대 포함하지 않는다(계약 §0-3).
 */
@RestController
@RequestMapping("/api/auth")
public class PublicAuthController {

    private final PublicAuthService service;

    public PublicAuthController(PublicAuthService service) {
        this.service = service;
    }

    /** POST /api/auth/register — 공개 회원가입(email 중복 시 409). */
    @PostMapping("/register")
    public ApiResponse<RegisterResponse> register(@Valid @RequestBody RegisterRequest request) {
        return ApiResponse.ok(service.register(request));
    }

    /** POST /api/auth/password/forgot — 항상 200(사용자 열거 방지), 존재 시 재설정 코드 발급. */
    @PostMapping("/password/forgot")
    public ApiResponse<MessageResponse> forgot(@Valid @RequestBody ForgotPasswordRequest request) {
        return ApiResponse.ok(service.forgotPassword(request));
    }

    /** POST /api/auth/password/reset — 코드 검증 후 비밀번호 갱신. */
    @PostMapping("/password/reset")
    public ApiResponse<MessageResponse> reset(@Valid @RequestBody ResetPasswordRequest request) {
        return ApiResponse.ok(service.resetPassword(request));
    }
}
