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

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

/**
 * ObpGwMetric VO - 로그 집계 결과 매핑용
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ObpGwMetricVO {

    private static final DateTimeFormatter TIMESLICE_FORMATTER = DateTimeFormatter.ofPattern("yyyyMMddHH0000000");

    /** API ID (EAISVCNAME) */
    private String apiId;

    /** 클라이언트 ID (CLIENTID) */
    private String clientId;

    /** 호스트 이름 (EAISEVRINSTNCNAME) */
    private String hostname;

    /** 기관 ID (ORGID) */
    private String orgId;

    /** 타임슬라이스 문자열 (yyyyMMddHH0000000) */
    private String timeslice;

    /** 시도 횟수 (LOGPRCSSSERNO='100' 건수) */
    private Long attemptedCount;

    /** 완료 횟수 (LOGPRCSSSERNO='400' AND 성공 조건 건수) */
    private Long completedCount;

    /** EAI 서비스 일련번호 (URI 조회용 - HTTP_ADAPTER_EXTRA_LOG.GUID와 매핑) */
    private String eaiSvcSerno;

    /**
     * timeslice 문자열을 LocalDateTime으로 변환
     */
    public LocalDateTime getTimesliceAsLocalDateTime() {
        if (timeslice == null || timeslice.isEmpty()) {
            return null;
        }
        // "yyyyMMddHH0000000" 형식에서 앞 10자리(yyyyMMddHH)만 사용
        String dateTimeStr = timeslice.substring(0, 10) + "0000";
        return LocalDateTime.parse(dateTimeStr, DateTimeFormatter.ofPattern("yyyyMMddHHmmss"));
    }

    /**
     * 집계 키 생성 (apiId + clientId + hostname + orgId)
     */
    public String getAggregationKey() {
        return String.join("|",
                nullSafe(apiId),
                nullSafe(clientId),
                nullSafe(hostname),
                nullSafe(orgId)
        );
    }

    private String nullSafe(String value) {
        return value != null ? value : "";
    }
}
