/**
 * 투자분석 화면 설정 저장 방식 및 파일 저장
 * - 저장 방식: 'file' (기본) | 'db'
 * - file 모드: localStorage 기반 설정 파일
 */
import type { IndicatorVisibilitySettings } from '../contexts/IndicatorVisibilityContext';
import type { IndicatorOrder } from '../contexts/IndicatorVisibilityContext';

export type InvestmentAnalysisStorageMode = 'file' | 'db';

const STORAGE_MODE_KEY = 'investmentAnalysisSettingsStorageMode';
const CONFIG_FILE_KEY = 'investmentAnalysisSettingsFile';

/** 추세 판단 전략 */
export type TrendStrategyType = 'none' | 'aggressive' | 'balanced' | 'conservative';

export interface InvestmentAnalysisConfig {
  version: number;
  strategyType?: string;  // 하위 호환
  timeInterval: string;
  /** 추세 판단 전략 */
  trendStrategy?: TrendStrategyType;
  /** 추세 사용안함 시: 일반 투자전략 ID */
  generalStrategyId?: number | null;
  /** 정배열 전략 ID */
  uptrendStrategyId?: number | null;
  /** 역배열 전략 ID */
  downtrendStrategyId?: number | null;
  indicatorSettings: Partial<IndicatorVisibilitySettings>;
  indicatorOrder: IndicatorOrder[];
  exportedAt: string;
}

const DEFAULT_STRATEGY = 'TREND_STOCHASTIC';
const DEFAULT_TIME_INTERVAL = '5m';

/** 저장 방식 조회 (기본값: file) */
export const getStorageMode = (): InvestmentAnalysisStorageMode => {
  try {
    const mode = localStorage.getItem(STORAGE_MODE_KEY);
    return (mode === 'db' ? 'db' : 'file') as InvestmentAnalysisStorageMode;
  } catch {
    return 'file';
  }
};

/** 저장 방식 설정 */
export const setStorageMode = (mode: InvestmentAnalysisStorageMode): void => {
  try {
    localStorage.setItem(STORAGE_MODE_KEY, mode);
  } catch (e) {
    console.error('저장 방식 설정 실패:', e);
  }
};

/** 파일 모드: 설정 로드 */
export const loadFromFile = (): Partial<InvestmentAnalysisConfig> | null => {
  try {
    const raw = localStorage.getItem(CONFIG_FILE_KEY);
    if (!raw) return null;
    const parsed = JSON.parse(raw) as InvestmentAnalysisConfig;
    return parsed && typeof parsed === 'object' ? parsed : null;
  } catch {
    return null;
  }
};

/** 파일 모드: 설정 저장 */
export const saveToFile = (config: Partial<InvestmentAnalysisConfig>): void => {
  try {
    const toSave: InvestmentAnalysisConfig = {
      version: 1,
      strategyType: config.strategyType ?? DEFAULT_STRATEGY,
      timeInterval: config.timeInterval ?? DEFAULT_TIME_INTERVAL,
      trendStrategy: config.trendStrategy,
      generalStrategyId: config.generalStrategyId ?? null,
      uptrendStrategyId: config.uptrendStrategyId ?? null,
      downtrendStrategyId: config.downtrendStrategyId ?? null,
      indicatorSettings: config.indicatorSettings ?? {},
      indicatorOrder: config.indicatorOrder ?? [],
      exportedAt: new Date().toISOString(),
      ...config,
    };
    localStorage.setItem(CONFIG_FILE_KEY, JSON.stringify(toSave, null, 2));
  } catch (e) {
    console.error('설정 파일 저장 실패:', e);
  }
};

/** 설정 파일 다운로드 (JSON) */
export const downloadConfigFile = (config: InvestmentAnalysisConfig): void => {
  const json = JSON.stringify(config, null, 2);
  const blob = new Blob([json], { type: 'application/json' });
  const url = URL.createObjectURL(blob);
  const a = document.createElement('a');
  a.href = url;
  a.download = `investment-analysis-config-${new Date().toISOString().slice(0, 10)}.json`;
  a.click();
  URL.revokeObjectURL(url);
};

/** 설정 파일 업로드 후 적용 */
export const applyConfigFromFile = (content: string): { success: boolean; message: string } => {
  try {
    const parsed = JSON.parse(content) as Partial<InvestmentAnalysisConfig>;
    if (!parsed || typeof parsed !== 'object') {
      return { success: false, message: '잘못된 설정 파일 형식입니다.' };
    }
    saveToFile(parsed);
    return { success: true, message: '설정이 적용되었습니다.' };
  } catch {
    return { success: false, message: '설정 파일을 읽을 수 없습니다.' };
  }
};
