package com.zioinfo.kintex.webhook;

import com.zioinfo.kintex.common.ApiResponse;
import com.zioinfo.kintex.webhook.dto.WebhookDtos.InboundReceipt;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * F099 인바운드 웹훅 수신(공개 경로, 인증 없음 — {@code permitAll}).
 * <p><b>보안</b>: 인증 토큰이 없는 대신 ① 경로 {@code {token}}(추측 불가 랜덤 식별자) 존재·활성 검증
 * ② {@code X-Kintex-Signature} HMAC-SHA256 서명 검증(등록 시크릿 기반) <b>이중 검증</b>으로 방어한다.
 * 원문 바디({@code @RequestBody String})로 HMAC 을 계산(파싱 전 raw 필요).
 * <p><b>Rate 고려</b>: 공개 permitAll 경로이므로 실운영 배포 시 앞단 프록시(nginx)에서 토큰/IP 단위
 * rate limit 을 두는 것을 전제로 한다(애플리케이션은 무효 서명 트래픽을 저장하지 않아 적재 DoS 를 완화).
 */
@RestController
@RequestMapping("/api/webhooks/in")
public class WebhookInboundController {

    private final WebhookService service;

    public WebhookInboundController(WebhookService service) {
        this.service = service;
    }

    /**
     * POST /api/webhooks/in/{token} — 토큰 + HMAC 서명 검증 후 이벤트 저장.
     * 검증 실패는 401(존재·사유 미노출). 성공은 200 + accepted receipt.
     */
    @PostMapping("/{token}")
    public ResponseEntity<ApiResponse<InboundReceipt>> receive(
            @PathVariable String token,
            @RequestBody(required = false) String rawBody,
            @RequestHeader(value = "X-Kintex-Signature", required = false) String signature,
            @RequestHeader(value = "X-Kintex-Event", required = false) String eventType) {
        InboundReceipt receipt = service.receiveInbound(token, rawBody, signature, eventType);
        return ResponseEntity.ok(ApiResponse.ok(receipt));
    }
}
