package com.zioinfo.cms.delivery;

import com.zioinfo.cms.common.ApiResponse;
import com.zioinfo.cms.content.CmsContent;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;

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

/**
 * 헤드리스 공개 콘텐츠 전송 API (delivery).
 *
 * <p>보안 불변 규칙: 공개(인증 불필요)이되 PUBLISHED 상태 콘텐츠만 노출한다.
 * 미발행(DRAFT/REVIEW/APPROVED) 콘텐츠 프리뷰는 유효한 preview token 검증 시에만 허용한다.
 * Mall/홈페이지 등 외부 채널이 이 API를 소비한다.
 */
@RestController
@RequestMapping("/api/cms/delivery")
@RequiredArgsConstructor
public class DeliveryController {

    private final DeliveryService service;

    /** 발행 콘텐츠 목록 (published만). */
    @GetMapping("/content")
    public ApiResponse<List<CmsContent>> list(
            @RequestParam(required = false) String contentType,
            @RequestParam(defaultValue = "ko") String locale) {
        return ApiResponse.ok(service.listPublished(contentType, locale));
    }

    /** slug 단건 조회 (published만). */
    @GetMapping("/content/{slug}")
    public ApiResponse<CmsContent> bySlug(@PathVariable String slug,
                                          @RequestParam(defaultValue = "ko") String locale) {
        return ApiResponse.ok(service.getPublished(slug, locale));
    }

    /** 프리뷰 — 토큰 검증 후 미발행 콘텐츠도 조회 허용. */
    @GetMapping("/preview/{id}")
    public ApiResponse<CmsContent> preview(@PathVariable Long id, @RequestParam String token) {
        return ApiResponse.ok(service.preview(id, token));
    }

    /** 프리뷰 토큰 발급 (인증 사용자 전용은 SecurityConfig 미적용 — POST는 작성권한 필요). */
    @PostMapping("/preview-token/{id}")
    public ApiResponse<Map<String, String>> issueToken(@PathVariable Long id) {
        return ApiResponse.ok(Map.of("token", service.issuePreviewToken(id), "contentId", String.valueOf(id)));
    }
}
