package incheon.ags.mrb.analysis.vo.request;

import com.all4land.sa.model.HotspotModel;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter;
import lombok.Setter;
import org.geotools.process.spatialstatistics.enumeration.DistanceMethod;
import org.geotools.process.spatialstatistics.enumeration.SpatialConcept;
import org.geotools.process.spatialstatistics.enumeration.StandardizationMethod;

import javax.validation.constraints.NotNull;

@Getter
@Setter
@Schema(description = "핫스팟 요청")
public class HotSpotRequestDTO extends AbstractAnalysisRequestDTO{

    @Schema(description = "분석 대상 필드명")
    @NotNull
    String inputField;

    @Schema(description = "공간 개념 (예: 거리 기반, 인접 기반 등)")
    SpatialConcept spatialConcept = SpatialConcept.InverseDistance;

    @Schema(description = "거리 계산 방식 (예: 유클리드 거리/맨하튼 거리)")
    DistanceMethod distanceMethod = DistanceMethod.Euclidean;

    @Schema(description = "표준화 방식 (예: None, Row)")
    StandardizationMethod standardization = StandardizationMethod.None;

    @Schema(description = "검색 거리 (단위: 지도 CRS 단위)")
    Double searchDistance = 0.0;

    @Schema(description = "핫스팟 분석 모델")
    HotspotModel model = HotspotModel.GETIS_ORD_GI_STAR;

    @Override
    protected Object jsonPart() {
        return new Object() {
            public final String inputField = HotSpotRequestDTO.this.inputField;
            public final SpatialConcept spatialConcept = HotSpotRequestDTO.this.spatialConcept;
            public final DistanceMethod distanceMethod = HotSpotRequestDTO.this.distanceMethod;
            public final StandardizationMethod standardization = HotSpotRequestDTO.this.standardization;
            public final Double searchDistance = HotSpotRequestDTO.this.searchDistance;
            public final HotspotModel model = HotSpotRequestDTO.this.model;
        };
    }
}
