package incheon.ags.dss.green.web.dto;

import lombok.Builder;
import lombok.Getter;
import java.math.BigDecimal;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;

import incheon.ags.dss.green.vo.UrbGrnznAnlsDtlVO;
import incheon.ags.dss.green.vo.UrbGrnznAnlsMstVO;

@Getter
@Builder
public class UrbGrnznAnlsResponseDTO {

    /* ==========================
       Master 정보 (분석 결과)
       ========================== */
    private Integer anlsNo;           // 분석번호
    private Integer tareNo;           // 대상지번호
    private String userId;            // 사용자ID
    
    private BigDecimal tareArea;      // 대상지면적
    private BigDecimal tarePpltnCnt;  // 대상지인구수
    private BigDecimal psnbyGreensArea; // 인당녹지면적
    private BigDecimal minGreensRt;   // 최소녹지비율
    
    private BigDecimal nowGreensArea; // 현재녹지면적
    private BigDecimal needGreensArea; // 필요녹지면적
    
    private String frstRegDt;         // 등록일시
    private String lastMdfcnDt;       // 수정일시

    /* ==========================
       Inner Class: Detail 정보 (개별 녹지 공간)
       ========================== */
    @Getter
    @Builder
    public static class GreenZone {
        private Integer greensSpceNo; // 녹지공간번호
        private String atrbSe;        // 속성구분 (JM_01, DRAW 등)
        private String regType;       // 등록유형 (I, S, D)
        private String geom;          // 공간데이터 (WKT)
        private String area;          // 면적
    }

    /* ==========================
       Mapping Methods
       ========================== */

    /**
     * [Master] VO -> DTO 변환
     */
    public static UrbGrnznAnlsResponseDTO from(UrbGrnznAnlsMstVO vo) {
        if (vo == null) return null;

        return UrbGrnznAnlsResponseDTO.builder()
                .anlsNo(vo.getAnlsNo())
                .tareNo(vo.getTareNo())
                .userId(vo.getUserId())
                .tareArea(vo.getTareArea())
                .tarePpltnCnt(vo.getTarePpltnCnt())
                .psnbyGreensArea(vo.getPsnbyGreensArea())
                .minGreensRt(vo.getMinGreensRt())
                .nowGreensArea(vo.getNowGreensArea())
                .needGreensArea(vo.getNeedGreensArea())
                // 날짜 타입이 String인 경우 그대로, Date인 경우 toString() 처리
                .frstRegDt(vo.getFrstRegDt()) 
                .lastMdfcnDt(vo.getLastMdfcnDt())
                .build();
    }

    /**
     * [Detail Single] VO -> DTO(Inner) 변환
     */
    public static GreenZone from(UrbGrnznAnlsDtlVO vo) {
        if (vo == null) return null;

        return GreenZone.builder()
                .greensSpceNo(vo.getGreensSpceNo())
                .atrbSe(vo.getAtrbSe())
                .regType(vo.getRegType())
                .geom(vo.getGeom())
                .area(vo.getArea())
                .build();
    }

    /**
     * [Detail List] List<VO> -> List<DTO(Inner)> 변환
     */
    public static List<GreenZone> fromDetailList(List<UrbGrnznAnlsDtlVO> list) {
        if (list == null || list.isEmpty()) {
            return Collections.emptyList();
        }
        return list.stream()
                .map(UrbGrnznAnlsResponseDTO::from)
                .collect(Collectors.toList());
    }
}