package com.eactive.eai.rms.data.entity.onl.apim.obp;

import com.eactive.apim.portal.obp.entity.ObpGwMetric;
import com.eactive.apim.portal.obp.repository.ObpGwMetricRepository;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Optional;

/**
 * ObpGwMetric Service - 엔티티 CRUD 서비스
 */
@Service
@Transactional(transactionManager = "transactionManagerForEMS")
public class ObpGwMetricService {

    private final ObpGwMetricRepository repository;

    public ObpGwMetricService(ObpGwMetricRepository repository) {
        this.repository = repository;
    }

    /**
     * UPSERT 판단을 위한 기존 데이터 조회 (NULL 안전)
     */
    public Optional<ObpGwMetric> findByUniqueKey(LocalDateTime timeslice, String apiId, String clientId, String hostname, String orgId) {
        return repository.findByUniqueKeyNullSafe(timeslice, apiId, clientId, hostname, orgId);
    }

    /**
     * 특정 시간대의 모든 GwMetric 데이터 조회
     */
    public List<ObpGwMetric> findByTimeslice(LocalDateTime timeslice) {
        return repository.findByTimeslice(timeslice);
    }

    /**
     * 특정 시간 범위의 GwMetric 데이터 조회
     */
    public List<ObpGwMetric> findByTimesliceBetween(LocalDateTime startTime, LocalDateTime endTime) {
        return repository.findByTimesliceBetween(startTime, endTime);
    }

    /**
     * 특정 시간대 이후의 모든 GwMetric 데이터 조회
     */
    public List<ObpGwMetric> findByTimesliceGreaterThanEqual(LocalDateTime timeslice) {
        return repository.findByTimesliceGreaterThanEqual(timeslice);
    }

    /**
     * 특정 시간대 이후의 GwMetric 데이터 조회 (row 수 제한)
     *
     * @param timeslice 조회 시작 시간대
     * @param limit 최대 조회 건수 (0이면 무제한)
     * @return 조회된 지표 목록 (timeslice ASC 정렬)
     */
    public List<ObpGwMetric> findByTimesliceGreaterThanEqual(LocalDateTime timeslice, int limit) {
        if (limit <= 0) {
            // 무제한 조회 (기존 동작 유지)
            return repository.findByTimesliceGreaterThanEqual(timeslice);
        } else {
            // 제한적 조회 (timeslice ASC 정렬 + limit)
            Pageable pageable = PageRequest.of(0, limit, Sort.by(Sort.Order.asc("timeslice")));
            return repository.findByTimesliceGreaterThanEqual(timeslice, pageable);
        }
    }

    /**
     * 엔티티 저장 (INSERT 또는 UPDATE)
     */
    public ObpGwMetric save(ObpGwMetric entity) {
        return repository.save(entity);
    }

    /**
     * 엔티티 목록 저장
     */
    public List<ObpGwMetric> saveAll(List<ObpGwMetric> entities) {
        return repository.saveAll(entities);
    }
}
