package com.goldenchart.dto;

import com.fasterxml.jackson.databind.JsonNode;
import lombok.*;

import java.util.List;
import java.util.Map;

/**
 * 백테스팅 요청 DTO.
 *
 * <pre>
 * {
 *   "strategyId": 1,                         // DB 전략 ID (선택 — 없으면 dsl 직접 전송)
 *   "buyCondition":  { ...LogicNode },        // 매수 조건 DSL
 *   "sellCondition": { ...LogicNode },        // 매도 조건 DSL
 *   "bars": [ {time, open, high, low, close, volume}, ... ],
 *   "timeframe": "1D",
 *   "indicatorParams": { "CCI": {"length":13}, ... }  // 사용자 설정 파라미터 (선택)
 * }
 * </pre>
 */
@Data @Builder @NoArgsConstructor @AllArgsConstructor
public class BacktestRequest {

    /** DB 저장 전략 ID (선택 — 설정 시 buyCondition/sellCondition 무시) */
    private Long strategyId;

    /** 매수 조건 DSL */
    private JsonNode buyCondition;

    /** 매도 조건 DSL */
    private JsonNode sellCondition;

    /** OHLCV 캔들 데이터 */
    private List<OhlcvBar> bars;

    /** 타임프레임 (1m/5m/15m/30m/1h/4h/1D/1W/1M) */
    private String timeframe;

    /**
     * 지표 파라미터 오버라이드.
     * key = indicatorType (e.g. "CCI"), value = {length:13, ...}
     * 없으면 IndicatorService 기본값 사용.
     */
    private Map<String, Map<String, Object>> indicatorParams;

    /** 백테스팅 설정 옵션 (선택 — 없으면 기본값 사용) */
    private BacktestSettingsDto settings;

    /** 종목 코드 (결과 저장용, e.g. "KRW-BTC") */
    private String symbol;

    /** 전략 이름 (결과 저장용) */
    private String strategyName;

    /** 디바이스 ID (결과 저장용) */
    private String deviceId;
}
