/**
 * 자동매매 API 서비스
 * - 업비트 API를 통한 자동 매수/매도 기능
 * - 백엔드 프록시를 통해 API 키 보안 유지
 */
import { API_BASE_URL } from './apiConfig';

// ============ 타입 정의 ============

/** 주문 유형 */
export type OrderType = 'limit' | 'price' | 'market' | 'best';

/** 주문 상태 */
export type OrderState = 'wait' | 'watch' | 'done' | 'cancel';

/** 자동매매 전략 */
export interface AutoTradingStrategy {
  id?: string;
  name: string;
  market: string;
  enabled: boolean;
  dryRun: boolean; // 실제 주문 없이 시뮬레이션
  buyCondition: BuyCondition;
  sellCondition: SellCondition;
  riskLimit: RiskLimit;
}

/** 매수 조건 */
export interface BuyCondition {
  orderType: OrderType;
  amount: number; // KRW 금액 (price 타입) 또는 수량 (limit 타입)
  price?: number; // 지정가 (limit 타입)
  trigger?: string; // 'manual' | 'signal' | 'schedule'
  signalStrategyId?: string; // 전략 규칙 ID
}

/** 매도 조건 */
export interface SellCondition {
  orderType: OrderType;
  volume?: number; // 비율(0~100) 또는 수량
  volumePercent?: number;
  trigger?: string;
  stopLossPercent?: number; // 손절 %
  takeProfitPercent?: number; // 익절 %
}

/** 리스크 제한 */
export interface RiskLimit {
  maxOrderAmount: number; // 1회 최대 주문 금액
  maxDailyLoss: number; // 일일 최대 손실
  maxPosition: number; // 최대 보유 종목 수
}

/** 계정 잔고 */
export interface AccountBalance {
  currency: string;
  balance: string;
  locked: string;
  avgBuyPrice: string;
  avgBuyPriceModified: boolean;
  unitCurrency: string;
}

/** 주문 정보 */
export interface OrderInfo {
  uuid: string;
  side: 'bid' | 'ask';
  ord_type: OrderType;
  price: string;
  state: OrderState;
  market: string;
  created_at: string;
  volume?: string;
  remaining_volume?: string;
  executed_volume?: string;
  executed_funds?: string;
}

/** 포지션 (보유 종목) */
export interface Position {
  market: string;
  currency: string;
  balance: number;
  avgBuyPrice: number;
  currentPrice: number;
  evalAmount: number;
  profitLoss: number;
  profitLossRate: number;
}

/** API 키 상태 */
export interface ApiKeyStatus {
  configured: boolean;
  valid: boolean;
}

// ============ API 함수 ============

/** API 키 상태 확인 */
export const checkApiKeyStatus = async (): Promise<ApiKeyStatus> => {
  const res = await fetch(`${API_BASE_URL}/auto-trading/api-key/status`);
  if (!res.ok) throw new Error('API 키 상태 확인 실패');
  return res.json();
};

/** 계정 잔고 조회 */
export const getAccountBalances = async (): Promise<AccountBalance[]> => {
  const res = await fetch(`${API_BASE_URL}/auto-trading/accounts`);
  if (!res.ok) throw new Error('잔고 조회 실패');
  return res.json();
};

/** KRW 잔고만 조회 */
export const getKrwBalance = async (): Promise<number> => {
  const accounts = await getAccountBalances();
  const krw = accounts.find((a) => a.currency === 'KRW');
  return krw ? parseFloat(krw.balance) : 0;
};

/** 보유 종목 조회 (포지션) */
export const getPositions = async (): Promise<Position[]> => {
  const res = await fetch(`${API_BASE_URL}/auto-trading/positions`);
  if (!res.ok) throw new Error('포지션 조회 실패');
  return res.json();
};

/** 주문 내역 조회 */
export const getOrderHistory = async (market?: string, state?: OrderState): Promise<OrderInfo[]> => {
  const params = new URLSearchParams();
  if (market) params.append('market', market);
  if (state) params.append('state', state);
  const res = await fetch(`${API_BASE_URL}/auto-trading/orders?${params}`);
  if (!res.ok) throw new Error('주문 내역 조회 실패');
  return res.json();
};

/** 자동매매 전략 목록 */
export const getStrategies = async (): Promise<AutoTradingStrategy[]> => {
  const res = await fetch(`${API_BASE_URL}/auto-trading/strategies`);
  if (!res.ok) throw new Error('전략 조회 실패');
  return res.json();
};

/** 자동매매 전략 저장 */
export const saveStrategy = async (strategy: AutoTradingStrategy): Promise<AutoTradingStrategy> => {
  const res = await fetch(`${API_BASE_URL}/auto-trading/strategies`, {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify(strategy),
  });
  if (!res.ok) throw new Error('전략 저장 실패');
  return res.json();
};

/** 자동매매 전략 수정 */
export const updateStrategy = async (id: string, strategy: Partial<AutoTradingStrategy>): Promise<void> => {
  const res = await fetch(`${API_BASE_URL}/auto-trading/strategies/${id}`, {
    method: 'PUT',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify(strategy),
  });
  if (!res.ok) throw new Error('전략 수정 실패');
};

/** 매수 주문 */
export const placeBuyOrder = async (params: {
  market: string;
  orderType: OrderType;
  amount?: number;
  price?: number;
  volume?: number;
}): Promise<OrderInfo> => {
  const res = await fetch(`${API_BASE_URL}/auto-trading/orders/buy`, {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify(params),
  });
  if (!res.ok) throw new Error('매수 주문 실패');
  return res.json();
};

/** 매도 주문 */
export const placeSellOrder = async (params: {
  market: string;
  orderType: OrderType;
  volume?: number;
  price?: number;
}): Promise<OrderInfo> => {
  const res = await fetch(`${API_BASE_URL}/auto-trading/orders/sell`, {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify(params),
  });
  if (!res.ok) throw new Error('매도 주문 실패');
  return res.json();
};

/** 주문 취소 */
export const cancelOrder = async (orderId: string): Promise<void> => {
  const res = await fetch(`${API_BASE_URL}/auto-trading/orders/${orderId}`, {
    method: 'DELETE',
  });
  if (!res.ok) throw new Error('주문 취소 실패');
};
