package com.eactive.eai.rms.onl.transaction.apim;

import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;

/**
 * D10 예제값 자동 생성 규칙.
 * <ul>
 *   <li>string  → {@code sample_} + 항목명. 최대길이 초과 시 left-cut(앞에서 자름).</li>
 *   <li>integer → {@code 1}</li>
 *   <li>number  → {@code 1.1} (소수 자릿수 지정 시 {@code 1.1000} 형태)</li>
 *   <li>boolean → {@code false}</li>
 * </ul>
 */
@Service
public class DjbApiSpecSampleGenerator {

    /** 원시 데이터타입(레이아웃 값)을 OpenAPI 계열 카테고리로 분류. */
    public String categoryOf(String rawDataType) {
        if (rawDataType == null) {
            return "string";
        }
        String t = rawDataType.trim().toLowerCase();
        if (t.contains("bool")) {
            return "boolean";
        }
        if (t.contains("decimal") || t.contains("double") || t.contains("float") || t.contains("number")) {
            return "number";
        }
        if (t.contains("int") || t.contains("long")) {
            return "integer";
        }
        if (t.contains("object") || t.contains("group")) {
            return "object";
        }
        if (t.contains("array") || t.contains("grid") || t.contains("list")) {
            return "array";
        }
        return "string";
    }

    /**
     * 예제값 생성.
     * @param rawDataType 레이아웃 데이터타입(원시)
     * @param fieldName   항목명
     * @param maxLen      최대 길이(0/음수면 무제한)
     * @param decimalLen  소수 자릿수(0이면 미적용)
     */
    public String exampleFor(String rawDataType, String fieldName, int maxLen, int decimalLen) {
        switch (categoryOf(rawDataType)) {
            case "integer":
                return "1";
            case "number":
                if (decimalLen > 0) {
                    StringBuilder sb = new StringBuilder("1.");
                    for (int i = 0; i < decimalLen; i++) {
                        sb.append(i == 0 ? '1' : '0');
                    }
                    return sb.toString();
                }
                return "1.1";
            case "boolean":
                return "false";
            case "object":
            case "array":
                return ""; // 컨테이너는 예제값 없음(자식으로 표현)
            default:
                String v = "sample_" + StringUtils.defaultString(fieldName);
                if (maxLen > 0 && v.length() > maxLen) {
                    v = v.substring(0, maxLen); // left-cut
                }
                return v;
        }
    }
}
