package gc.mda.signal_batch.batch.writer;

import gc.mda.signal_batch.batch.reader.AisTargetCacheManager;
import gc.mda.signal_batch.batch.reader.ChnPrmShipCacheManager;
import gc.mda.signal_batch.domain.vessel.model.AisTargetEntity;
import gc.mda.signal_batch.global.util.SignalKindCode;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.batch.item.Chunk;
import org.springframework.batch.item.ItemWriter;
import org.springframework.stereotype.Component;

import java.util.List;

/**
 * AIS Target 캐시 Writer
 *
 * 처리 순서:
 * 1. SignalKindCode 치환 (vesselType + extraInfo → MDA 범례코드)
 * 2. AisTargetCacheManager에 일괄 저장
 * 3. ChnPrmShipCacheManager에 대상 MMSI만 필터 저장
 *
 * DB 저장은 Phase 3의 AisPositionSyncStep에서 5분 집계 Job에 편승하여 수행.
 */
@Slf4j
@Component
@RequiredArgsConstructor
public class AisTargetCacheWriter implements ItemWriter<AisTargetEntity> {

    private final AisTargetCacheManager cacheManager;
    private final ChnPrmShipCacheManager chnPrmShipCacheManager;

    @Override
    public void write(Chunk<? extends AisTargetEntity> chunk) {
        List<? extends AisTargetEntity> items = chunk.getItems();
        log.debug("AIS Target 캐시 업데이트 시작: {} 건", items.size());

        // 1. SignalKindCode 치환
        items.forEach(item -> {
            SignalKindCode kindCode = SignalKindCode.resolve(item.getVesselType(), item.getExtraInfo());
            item.setSignalKindCode(kindCode.getCode());
        });

        // 2. 메인 캐시 업데이트 (최신 위치 — t_ais_position 동기화용)
        @SuppressWarnings("unchecked")
        List<AisTargetEntity> entityList = (List<AisTargetEntity>) items;
        cacheManager.putAll(entityList);

        // 3. 트랙 버퍼에 누적 (5분 집계 시 LineStringM 생성용)
        cacheManager.appendAllForTrack(entityList);

        log.debug("AIS Target 캐시 업데이트 완료: {} 건 (캐시 크기: {})",
                items.size(), cacheManager.size());

        // 4. ChnPrmShip 전용 캐시 업데이트
        chnPrmShipCacheManager.putIfTarget(entityList);
    }
}
