package com.goldenchart.dto;

import lombok.*;

import java.math.BigDecimal;

/**
 * 백테스팅 설정 DTO.
 * Ta4j 의 비용 모델·손절/익절·트레일링 스탑·진입가격·재진입 등 모든 옵션을 담는다.
 */
@Data @Builder @NoArgsConstructor @AllArgsConstructor
public class BacktestSettingsDto {

    private Long id;

    // ── 자본 설정 ──────────────────────────────────────────────────────────────
    /** 초기 자본 (원) */
    @Builder.Default
    private BigDecimal initialCapital = new BigDecimal("10000000.00");

    // ── 비용 모델 ──────────────────────────────────────────────────────────────
    /** LINEAR | ZERO */
    @Builder.Default
    private String commissionType = "LINEAR";

    /** 수수료율 (예: 0.0015 = 0.15%) */
    @Builder.Default
    private BigDecimal commissionRate = new BigDecimal("0.00150");

    /** 슬리피지율 (예: 0.0005 = 0.05%) */
    @Builder.Default
    private BigDecimal slippageRate = new BigDecimal("0.00050");

    // ── 진입/청산 가격 ─────────────────────────────────────────────────────────
    /** CLOSE | NEXT_OPEN */
    @Builder.Default
    private String entryPriceType = "CLOSE";

    /** CLOSE | NEXT_OPEN */
    @Builder.Default
    private String exitPriceType = "CLOSE";

    // ── 포지션 방향 ────────────────────────────────────────────────────────────
    /** LONG | SHORT | BOTH */
    @Builder.Default
    private String positionDirection = "LONG";

    // ── 거래 규모 ──────────────────────────────────────────────────────────────
    /** CAPITAL_PCT | FIXED_AMOUNT */
    @Builder.Default
    private String tradeSizeType = "CAPITAL_PCT";

    /** 비율(%) 또는 고정 금액(원) */
    @Builder.Default
    private BigDecimal tradeSizeValue = new BigDecimal("100.0000");

    // ── 손절 (StopLossRule) ───────────────────────────────────────────────────
    @Builder.Default
    private Boolean stopLossEnabled = false;

    /** 손절 비율 (%) */
    @Builder.Default
    private BigDecimal stopLossPct = new BigDecimal("2.000");

    // ── 익절 (StopGainRule) ───────────────────────────────────────────────────
    @Builder.Default
    private Boolean takeProfitEnabled = false;

    /** 익절 비율 (%) */
    @Builder.Default
    private BigDecimal takeProfitPct = new BigDecimal("5.000");

    // ── 트레일링 스탑 (TrailingStopLossRule) ─────────────────────────────────
    @Builder.Default
    private Boolean trailingStopEnabled = false;

    /** 트레일링 스탑 비율 (%) */
    @Builder.Default
    private BigDecimal trailingStopPct = new BigDecimal("2.000");

    // ── 재진입 제어 ────────────────────────────────────────────────────────────
    /** 매도 후 재진입 대기 봉 수 */
    @Builder.Default
    private Integer reentryWaitBars = 0;

    /** 최대 동시 보유 포지션 수 */
    @Builder.Default
    private Integer maxOpenTrades = 1;

    // ── 포지션 종속성 모드 ─────────────────────────────────────────────────────
    /** "LONG_ONLY" | "SIGNAL_ONLY" — 매도 시그널 포지션 종속성 제어 */
    @Builder.Default
    private String positionMode = "LONG_ONLY";

    // ── 분할 청산 ──────────────────────────────────────────────────────────────
    @Builder.Default
    private Boolean partialExitEnabled = false;

    /** 분할 청산 비율 (%) */
    @Builder.Default
    private BigDecimal partialExitPct = new BigDecimal("50.000");
}
