package com.erp.service;

import com.erp.common.BaseService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import java.util.*;

@Service
@RequiredArgsConstructor
@Slf4j
public class ScreenFileService extends BaseService {

    /**
     * 화면의 컴포넌트별 파일 목록 조회 및 그룹화
     * target_objid 형식: screen_files:{screenId}:{componentId}:{fieldName}
     */
    public Map<String, Object> getScreenComponentFiles(String screenId) {
        log.info("화면 컴포넌트 파일 조회 시작: screenId={}", screenId);

        Map<String, Object> params = new HashMap<>();
        params.put("target_objid_pattern", "screen_files:" + screenId + ":%");

        List<Map<String, Object>> files = sqlSession.selectList(
                "screenFile.selectScreenComponentFiles", params);

        // 컴포넌트별로 파일 그룹화
        Map<String, List<Map<String, Object>>> componentFiles = new LinkedHashMap<>();

        for (Map<String, Object> file : files) {
            String targetObjid = (String) file.get("target_objid");
            if (targetObjid == null) continue;

            String[] parts = targetObjid.split(":");
            if (parts.length < 3) continue;

            String componentId = parts[2];
            componentFiles.computeIfAbsent(componentId, k -> new ArrayList<>())
                    .add(mapFileRow(file));
        }

        log.info("화면 컴포넌트 파일 조회 완료: {}개 컴포넌트, 총 {}개 파일",
                componentFiles.size(), files.size());

        Map<String, Object> result = new LinkedHashMap<>();
        result.put("success", true);
        result.put("component_files", componentFiles);
        result.put("total_files", files.size());
        result.put("component_count", componentFiles.size());
        return result;
    }

    /**
     * 특정 컴포넌트의 파일 목록 조회
     * target_objid 패턴: screen_files:{screenId}:{componentId}:%
     */
    public Map<String, Object> getComponentFiles(String screenId, String componentId) {
        log.info("컴포넌트 파일 조회: screenId={}, componentId={}", screenId, componentId);

        Map<String, Object> params = new HashMap<>();
        params.put("target_objid_pattern", "screen_files:" + screenId + ":" + componentId + ":%");

        List<Map<String, Object>> files = sqlSession.selectList(
                "screenFile.selectComponentFiles", params);

        List<Map<String, Object>> fileList = new ArrayList<>();
        for (Map<String, Object> file : files) {
            fileList.add(mapFileRow(file));
        }

        log.info("컴포넌트 파일 조회 완료: {}개 파일", fileList.size());

        Map<String, Object> result = new LinkedHashMap<>();
        result.put("success", true);
        result.put("files", fileList);
        result.put("component_id", componentId);
        result.put("screen_id", screenId);
        return result;
    }

    /** DB 컬럼 → Node 응답 필드 매핑 */
    private Map<String, Object> mapFileRow(Map<String, Object> file) {
        Map<String, Object> mapped = new LinkedHashMap<>();
        Object objid = file.get("objid");
        mapped.put("objid", objid != null ? objid.toString() : null);
        mapped.put("saved_file_name", file.get("saved_file_name"));
        mapped.put("real_file_name", file.get("real_file_name"));

        Object fileSize = file.get("file_size");
        mapped.put("file_size", fileSize != null ? ((Number) fileSize).longValue() : null);

        mapped.put("file_ext", file.get("file_ext"));
        mapped.put("file_path", file.get("file_path"));
        mapped.put("doc_type", file.get("doc_type"));
        mapped.put("doc_type_name", file.get("doc_type_name"));
        mapped.put("target_objid", file.get("target_objid"));
        mapped.put("parent_target_objid", file.get("parent_target_objid"));
        mapped.put("writer", file.get("writer"));

        Object regdate = file.get("created_date");
        mapped.put("created_date", regdate != null ? regdate.toString() : null);

        mapped.put("status", file.get("status"));
        return mapped;
    }
}
