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

import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.eactive.eai.rms.onl.manage.rule.layout.ui.LayoutItemUI;
import com.eactive.eai.rms.onl.manage.rule.layout.ui.LayoutUI;

/**
 * D9 레이아웃 머지: GW LayoutUI 를 마법사 그리드용 필드 목록으로 변환한다.
 *
 * <p>GW 에서 온 필드는 {@code sourceType=GW}(항목명/데이터타입 잠금)로 표기하고, 예제값은
 * {@link DjbApiSpecSampleGenerator} 규칙으로 자동 채운다. 저장된 spec 의 부가정보(설명/예제/제약)
 * 병합은 클라이언트(그리드)에서 사용자 편집분과 합치므로, 서버는 GW 원본 필드 + 자동 예제까지 제공한다.
 */
@Service
public class DjbApiSpecLayoutMergeService {

    @Autowired
    private DjbApiSpecSampleGenerator sampleGenerator;

    /** LayoutUI → 그리드 필드 행 목록(flat, depth/parentIndex 로 트리 복원 가능). */
    public List<Map<String, Object>> toFields(LayoutUI layout, String layoutType) {
        List<Map<String, Object>> rows = new ArrayList<>();
        if (layout == null || layout.getLayoutItems() == null) {
            return rows;
        }
        for (LayoutItemUI it : layout.getLayoutItems()) {
            // serno 0 은 root 컨테이너 → 스킵 (ApiSpecManService.generateSpecTableRows 규칙과 동일)
            if (it.getLoutItemSerno() != null && it.getLoutItemSerno() == 0) {
                continue;
            }
            String dataType = it.getLoutItemDataType();
            int len = it.getLoutItemLength();
            int dec = it.getLoutItemDecimal();

            Map<String, Object> r = new LinkedHashMap<>();
            r.put("serno", it.getLoutItemSerno());
            r.put("name", it.getLoutItemName());
            r.put("desc", it.getLoutItemDesc());
            r.put("itemType", it.getLoutItemType());          // FIELD / GROUP / GRID
            r.put("dataType", dataType);
            r.put("category", sampleGenerator.categoryOf(dataType));
            r.put("length", len);
            r.put("decimal", dec);
            r.put("depth", it.getLoutItemDepth());
            r.put("parentIndex", it.getParentLoutItemIndex());
            r.put("required", false);
            r.put("sourceType", "GW");
            r.put("example", sampleGenerator.exampleFor(dataType, it.getLoutItemName(), len, dec));
            rows.add(r);
        }
        return rows;
    }
}
