package com.zioinfo.kintex.visitor.notification;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

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

/**
 * F-C5 관람객 인앱 알림 서비스 — 발행(다른 서비스가 호출) + 조회/읽음.
 * <p>외부 채널 발송이 아닌 관람객 대면 인앱 알림함(대기 승격·RSVP·멤버십 등).
 */
@Service
public class VisitorNotificationService {

    private final VisitorNotificationMapper mapper;

    public VisitorNotificationService(VisitorNotificationMapper mapper) {
        this.mapper = mapper;
    }

    /** 알림 발행 — 다른 도메인 서비스(세션 대기 승격 등)가 트랜잭션 내에서 호출. */
    public void publish(String userId, String kind, String title, String body, String refType, String refId) {
        Map<String, Object> row = new java.util.HashMap<>();
        row.put("id", "vn-" + UUID.randomUUID());
        row.put("userId", userId);
        row.put("kind", kind);
        row.put("title", title);
        row.put("body", body);
        row.put("refType", refType);
        row.put("refId", refId);
        mapper.insert(row);
    }

    @Transactional(readOnly = true)
    public List<Map<String, Object>> list(String userId) {
        return mapper.listByUser(userId);
    }

    @Transactional(readOnly = true)
    public int unreadCount(String userId) {
        return mapper.unreadCount(userId);
    }

    @Transactional
    public void markRead(String userId, String id) {
        mapper.markRead(id, userId);
    }

    @Transactional
    public void markAllRead(String userId) {
        mapper.markAllRead(userId);
    }
}
