package incheon.cmm.g2f.layer.vo;

import java.util.Map;

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;

import lombok.Getter;
import lombok.Setter;
import lombok.NoArgsConstructor;

import io.swagger.v3.oas.annotations.media.Schema;

/**
 * 통합 피처 데이터 VO
 * Added/Modified 피처 모두 처리 가능한 통합 구조
 */
@Getter
@Setter
@NoArgsConstructor
@Schema(description = "피처 데이터")
public class FeatureVO {
    
    @Schema(description = "피처 ID (added: 무시됨, modified: 필수)", example = "12")
    private Integer id;             // added: 무시, modified: 필수
    
    @Schema(description = "GeoJSON 지오메트리 객체")
    private Object geometry;        // GeoJSON Object

    @Schema(description = "피처 속성 정보")
    private Map<String, Object> properties;
    
    // Modified 전용
    @Schema(description = "원본 정보 (수정 시에만 사용)")
    private OriginalInfo original;  // original.geometry, original.properties
    
    @Schema(description = "변경 정보 (수정 시에만 사용)")
    private ModifiedInfo modified;  // modified.geometry, modified.properties
    
    // 내부 처리용 (JSON 직렬화에서 제외)
    @JsonIgnore
    private String geometryString;  // Jackson 변환용
    
    /**
     * original/modified 구조 지원 - Original 정보
     */
    @Getter
    @Setter
    @NoArgsConstructor
    @Schema(description = "원본 피처 정보")
    public static class OriginalInfo {
        @Schema(description = "원본 지오메트리")
        private Object geometry;
        
        @Schema(description = "원본 속성 정보")
        private Map<String, Object> properties;
    }
    
    /**
     * original/modified 구조 지원 - Modified 정보
     */
    @Getter
    @Setter
    @NoArgsConstructor
    @Schema(description = "변경된 피처 정보")
    public static class ModifiedInfo {
        @Schema(description = "변경된 지오메트리")
        private Object geometry;
        
        @Schema(description = "변경된 속성 정보")
        private Map<String, Object> properties;
    }
}