package com.zioinfo.kintex.webhook.dto;

import java.time.OffsetDateTime;
import java.util.List;

/**
 * F099 웹훅 게이트웨이 DTO 모음.
 * <p><b>보안 불변</b>: 시크릿 원문·해시·봉인값은 어떤 응답 DTO 에도 담지 않는다(등록 시 1회만 클라이언트가 보유).
 * 아웃바운드 발송은 스텁(disabled) — 실 HTTP 콜은 수행하지 않는다.
 */
public final class WebhookDtos {

    private WebhookDtos() {
    }

    // ── 아웃바운드 구독(관리자 CRUD) ──
    /** 구독 응답 — secret 은 제외(등록 시에만 요청자가 원문 보유). */
    public record SubscriptionDto(String id, String eventType, String callbackUrl,
                                  String description, boolean active,
                                  OffsetDateTime createdAt, OffsetDateTime updatedAt) {
    }

    /** 구독 생성 요청 — secret 원문은 요청 본문으로만 받고 즉시 해시(SHA-256)하여 저장. */
    public record SubscriptionCreateRequest(String eventType, String callbackUrl,
                                            String secret, String description) {
    }

    /** 구독 수정 요청 — null 필드는 미변경. secret 제공 시에만 해시 재저장. */
    public record SubscriptionUpdateRequest(String callbackUrl, String secret,
                                            String description, Boolean active) {
    }

    // ── 아웃바운드 발송 큐(스텁) ──
    public record DeliveryDto(String id, String subscriptionId, String eventType,
                              String status, String note, OffsetDateTime createdAt) {
    }

    // ── 인바운드 수신 엔드포인트 설정(관리자) ──
    public record InboundEndpointDto(String id, String token, String sourceLabel,
                                     boolean active, OffsetDateTime createdAt) {
    }

    public record InboundEndpointCreateRequest(String sourceLabel, String secret) {
    }

    // ── 인바운드 수신 결과(수신 엔드포인트 응답) ──
    /** 수신 결과 — 상세 사유는 노출하지 않고 accepted 여부만(정보 최소 노출). */
    public record InboundReceipt(boolean accepted, String receiptId) {
    }

    // ── 인바운드 이벤트 로그 조회(관리자) ──
    public record InboundEventDto(String id, String endpointToken, String eventType,
                                  boolean signatureValid, OffsetDateTime receivedAt) {
    }

    /** 구독 관리 화면 종합(후속 웨이브 화면용 계약). */
    public record WebhookAdminView(List<SubscriptionDto> subscriptions,
                                   List<InboundEndpointDto> inboundEndpoints) {
    }
}
