import axios from 'axios';
import { getApiBaseUrl } from './apiConfig';

const API_BASE_URL = getApiBaseUrl();

/**
 * 백테스팅 요청 데이터
 */
export interface BacktestRequest {
  symbol: string;
  strategyId: number;
  startDate: string;  // ISO 8601 format
  endDate: string;    // ISO 8601 format
  initialCapital?: number;
  positionSizeRatio?: number;
  commissionRate?: number;
  timeframe?: string;  // 시간봉 (예: "3m", "5m", "10m", "15m", "30m", "1h", "4h", "1d", "1w")
  
  // 전략관리 규칙 ID (정배열/역배열 전략)
  uptrendStrategyId?: number;   // 정배열 전략 규칙 ID
  downtrendStrategyId?: number; // 역배열 전략 규칙 ID
  
  // 추세 판단 MA 설정 (프론트엔드에서 선택)
  trendShortMA?: number;   // 단기 MA (기본값: 10)
  trendMediumMA?: number;  // 중기 MA (기본값: 20)
  trendLongMA?: number;    // 장기 MA (기본값: 60)
  
  // 보조지표 파라미터 (설정 > 보조지표 설정에서 동기화)
  macdFastPeriod?: number;     // MACD Fast EMA 기간 (기본값: 12)
  macdSlowPeriod?: number;     // MACD Slow EMA 기간 (기본값: 26)
  macdSignalPeriod?: number;   // MACD Signal 기간 (기본값: 9)
  stochasticKPeriod?: number;  // Stochastic %K 기간 (기본값: 12)
  stochasticDPeriod?: number;  // Stochastic %D 기간 (기본값: 5)
  stochasticSlowing?: number;  // Stochastic Slowing 기간 (기본값: 5)
  williamsRPeriod?: number;    // Williams %R 기간 (기본값: 11)
  rsiPeriod?: number;          // RSI 기간 (기본값: 14)
  rsiOversold?: number;        // RSI 과매도 기준 (기본값: 30)
  rsiOverbought?: number;      // RSI 과매수 기준 (기본값: 70)
  cciOversold?: number;        // CCI 침체 기준 (기본값: -100)
  cciMiddle?: number;          // CCI 중앙 기준 (기본값: 0)
  cciOverbought?: number;      // CCI 과열 기준 (기본값: 100)
  
  // 매수/매도 금액 설정
  buyAmount?: number;          // 매수 금액 (KRW)
  sellAmount?: number;         // 매도 금액 (KRW)
  
  // ✅ 프론트엔드 제공 데이터 (워밍업 데이터 재요청 생략용)
  providedCandleData?: ProvidedCandleData[];  // 차트에 표시된 캔들 데이터
  useProvidedData?: boolean;                   // 제공된 데이터 사용 여부
}

/**
 * 프론트엔드에서 제공하는 캔들 데이터
 */
export interface ProvidedCandleData {
  time: string;
  open: number;
  high: number;
  low: number;
  close: number;
  volume: number;
  // MA 값들
  ma5?: number;
  ma10?: number;
  ma12?: number;
  ma20?: number;
  ma26?: number;
  ma50?: number;
  ma60?: number;
  ma100?: number;
  ma120?: number;
  ma200?: number;
}

/**
 * 조건 충족 정보
 */
export interface ConditionMatch {
  conditionType: string;     // 조건 종류 (MA, MACD, RSI 등)
  indicatorName?: string;    // 지표명 (한글 표시용)
  description: string;       // 조건 설명
  detailDescription?: string; // 상세 설명 (조건 충족 논리 설명)
  currentValue?: number;     // 현재 값
  targetValue?: number;      // 목표 값
  previousValue?: number;    // 이전 값
  secondaryValue?: number;   // 보조 값 (BETWEEN 조건 등)
  compareValue?: number;     // 비교 대상 값 (크로스 조건에서 비교 대상)
  matched: boolean;          // 충족 여부
}

/**
 * 해당 시점의 주요 지표 스냅샷
 */
export interface ChartIndicators {
  // 이동평균선
  ma10?: number;
  ma20?: number;
  ma60?: number;
  ma120?: number;
  
  // MACD
  macdLine?: number;
  macdSignal?: number;
  macdHistogram?: number;
  
  // Stochastic
  stochK?: number;
  stochD?: number;
  
  // RSI
  rsi?: number;
  
  // ADX
  adx?: number;
  plusDi?: number;
  minusDi?: number;
  
  // CCI
  cci?: number;
  
  // 일목균형표
  ichimokuTenkan?: number;
  ichimokuKijun?: number;
  ichimokuSenkouA?: number;
  ichimokuSenkouB?: number;
  ichimokuChikou?: number;
  
  // TRIX
  trix?: number;
  trixSignal?: number;
  
  // 이격도
  disparity?: number;
}

/**
 * 거래 기록
 */
export interface TradeRecord {
  timestamp: string;
  tradeType: string;  // "BUY" | "SELL"
  price: number;
  quantity: number;
  totalAmount: number;
  commission: number;
  balance: number;
  holdings: number;
  profitLoss?: number;
  returnRate?: number;
  signalScore?: number;
  note?: string;
  // 신호 발생 조건 상세 정보
  strategyName?: string;              // 적용된 전략 이름
  trendStatus?: string;               // 추세 상태 (정배열/역배열/혼조)
  matchedConditions?: ConditionMatch[]; // 충족된 조건 목록
  
  // 해당 시점 차트 정보 (OHLCV)
  open?: number;                      // 시가
  high?: number;                      // 고가
  low?: number;                       // 저가
  close?: number;                     // 종가
  volume?: number;                    // 거래량
  
  // 해당 시점 주요 지표 스냅샷
  indicators?: ChartIndicators;       // 주요 지표 스냅샷
}

/**
 * 성과 스냅샷
 */
export interface PerformanceSnapshot {
  timestamp: string;
  portfolioValue: number;
  returnRate: number;
  drawdown: number;
}

/**
 * 캔들 데이터
 */
export interface CandleData {
  time: string;
  open: number;
  high: number;
  low: number;
  close: number;
  volume: number;
  isBuyPoint?: boolean;
  isSellPoint?: boolean;
  // ✅ 동적 MA 값 (사용자 설정 기간 지원)
  maValues?: { [key: string]: number };  // 예: { "ma11": 25000.5, "ma25": 24500.0 }
  // ✅ 인덱스 시그니처 추가 (동적 속성 접근 허용)
  [key: string]: any;
}

/**
 * 지표 데이터
 */
export interface IndicatorData {
  time: string;
  timestamp: string;  // 실제 백엔드에서 사용하는 필드
  // 캔들 데이터 (서브차트 표시용)
  open?: number;
  high?: number;
  low?: number;
  close?: number;
  volume?: number;
  // MACD
  macd?: number;      // MACD Histogram
  macdLine?: number;
  signalLine?: number;
  signal?: number;    // signalLine 별칭
  /** WebSocket/일부 API에서 사용 — signalLine과 동일 의미 */
  macdSignal?: number;
  histogram?: number;
  macdHistogram?: number;  // 백엔드 필드명
  // Stochastic
  stochK?: number;
  stochD?: number;
  // ADX & DMI
  adx?: number;
  plusDI?: number;
  minusDI?: number;
  // CCI
  cci?: number;
  // RSI
  rsi?: number;           // RSI (Relative Strength Index)
  // OBV
  obv?: number;
  obvSignal?: number;     // OBV Signal Line (이동평균)
  // Williams %R
  williamsR?: number;
  // Momentum
  momentum?: number;
  // TRIX
  trix?: number;
  trixSignal?: number;
  // 이격도 (Disparity Index)
  disparity?: number;
  // BWI
  bwi?: number;
  // VolumeOSC
  volumeOsc?: number;
  // VR (Volume Ratio)
  vr?: number;
  vr2?: number;  // VR2 (독립적인 보조지표)
  // Psychological Line
  psychologicalLine?: number;
  newPsychological?: number;
  investPsychological?: number;
  // 백엔드 필드명 (호환성)
  newPsy?: number;
  investPsy?: number;
  // Moving Averages
  ma5?: number;   // 백엔드 실시간 계산
  ma10?: number;
  ma20?: number;
  ma60?: number;
  ma120?: number; // 백엔드 실시간 계산
  ma200?: number;
  // SMA (Simple Moving Average) - 백엔드에서 사용
  sma5?: number;
  sma10?: number;
  sma12?: number;
  sma20?: number;
  sma26?: number;
  sma50?: number;
  sma60?: number;
  sma120?: number;
  sma200?: number;
  trendStrength?: number;  // 추세 강도 (-100 ~ +100)
  // 일목균형표 (Ichimoku Cloud)
  ichimokuTenkan?: number;    // 전환선 (9일)
  ichimokuKijun?: number;     // 기준선 (26일)
  ichimokuChikou?: number;    // 후행스팬 (26일 전으로 이동)
  ichimokuSenkouA?: number;   // 선행스팬1 (26일 앞으로 이동)
  ichimokuSenkouB?: number;   // 선행스팬2 (26일 앞으로 이동)
  // 볼린저 밴드 (Bollinger Bands)
  bollingerUpper?: number;    // 상한선 (Middle + stdDev * 2)
  bollingerMiddle?: number;   // 중간선 (SMA)
  bollingerLower?: number;    // 하한선 (Middle - stdDev * 2)
  // 정배열/역배열 상태 (Backend에서 계산)
  isPerfectUptrend?: boolean;    // 정배열 여부 (MA10 > MA20 > MA60 && MACD > 0)
  isPerfectDowntrend?: boolean;  // 역배열 여부 (MA10 < MA20 < MA60 && MACD < 0)
  // ✅ 동적 MA 값 (사용자 설정 기간 지원)
  maValues?: { [key: string]: number };  // 예: { "ma11": 25000.5, "ma25": 24500.0 }
  // ✅ 인덱스 시그니처 추가 (동적 속성 접근 허용)
  [key: string]: any;
}

/**
 * 백테스팅 결과
 */
export interface BacktestResult {
  symbol: string;
  strategyId: number;
  strategyName: string;
  strategyType: string;  // STRATEGY_1, STRATEGY_2, ..., TREND_STOCHASTIC 등
  initialCapital: number;
  finalCapital: number;
  netProfit: number;
  returnRate: number;
  totalTrades: number;
  buyCount: number;
  sellCount: number;
  winningTrades: number;
  losingTrades: number;
  winRate: number;
  maxProfit: number;
  maxLoss: number;
  avgProfit: number;
  avgLoss: number;
  maxConsecutiveWins: number;
  maxConsecutiveLosses: number;
  maxCapital: number;
  maxDrawdown: number;
  sharpeRatio: number;
  totalCommission: number;
  tradeRecords: TradeRecord[];
  performanceHistory: PerformanceSnapshot[];
  candleData: CandleData[];
  indicatorData: IndicatorData[];
}

/**
 * 백테스팅 실행
 */
export const runBacktest = async (request: BacktestRequest): Promise<BacktestResult> => {
  const response = await axios.post<BacktestResult>(`${API_BASE_URL}/backtest`, request, {
    headers: {
      'Content-Type': 'application/json',
    },
  });
  return response.data;
};

/**
 * 빠른 백테스팅 (쿼리 파라미터 방식)
 */
export const quickBacktest = async (
  symbol: string,
  strategyId: number,
  startDate: string,
  endDate: string
): Promise<BacktestResult> => {
  const response = await axios.get<BacktestResult>(`${API_BASE_URL}/backtest/quick`, {
    params: {
      symbol,
      strategyId,
      startDate,
      endDate,
    },
  });
  return response.data;
};

/**
 * 백테스팅 상태 확인
 */
export const getBacktestStatus = async (): Promise<{ status: string; message: string }> => {
  const response = await axios.get(`${API_BASE_URL}/backtest/status`);
  return response.data;
};

