import axios from 'axios';

// Docker 환경에서는 Nginx 프록시를 통해 상대 경로로 API 호출
// 개발 환경에서 직접 백엔드 연결이 필요한 경우 REACT_APP_API_BASE_URL 환경 변수 사용
const API_BASE_URL = process.env.REACT_APP_API_BASE_URL || '';

const api = axios.create({
  baseURL: API_BASE_URL,
  withCredentials: true,
});

// 인증 토큰을 헤더에 추가하는 인터셉터
api.interceptors.request.use(
  (config) => {
    const token = localStorage.getItem('accessToken');
    if (token) {
      config.headers.Authorization = `Bearer ${token}`;
    }
    return config;
  },
  (error) => {
    return Promise.reject(error);
  }
);

// ==================== 로그인 사용자용 API ====================

export const getUserIndicatorSettings = async (): Promise<string> => {
  try {
    const response = await api.get<string>('/api/settings/indicator-visibility');
    console.log('🔍 사용자 보조지표 설정 API 응답:', response.data, 'type:', typeof response.data);
    
    // 응답이 객체인 경우 문자열로 변환
    if (typeof response.data === 'object' && response.data !== null) {
      return JSON.stringify(response.data);
    }
    
    return response.data || '{}';
  } catch (error) {
    console.error('보조지표 설정 조회 실패:', error);
    return '{}';
  }
};

export const saveUserIndicatorSettings = async (settings: string): Promise<void> => {
  try {
    await api.post('/api/settings/indicator-visibility', { settings });
    console.log('보조지표 설정 저장 성공');
  } catch (error) {
    console.error('보조지표 설정 저장 실패:', error);
    throw error;
  }
};

export const deleteUserIndicatorSettings = async (): Promise<void> => {
  try {
    await api.delete('/api/settings/indicator-visibility');
  } catch (error) {
    console.error('보조지표 설정 삭제 실패:', error);
    throw error;
  }
};

// ==================== 게스트(비로그인) 사용자용 API ====================

// 디바이스 ID 생성 및 관리
const DEVICE_ID_KEY = 'guest_device_id';

// UUID v4 생성 함수 (crypto.randomUUID의 폴백 포함)
const generateUUID = (): string => {
  // crypto.randomUUID가 지원되는 경우 (HTTPS 또는 localhost)
  if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {
    try {
      return crypto.randomUUID();
    } catch (e) {
      console.warn('crypto.randomUUID 사용 실패, 폴백 메서드 사용:', e);
    }
  }
  
  // 폴백: UUID v4 형식 생성 (xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx)
  return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
    const r = Math.random() * 16 | 0;
    const v = c === 'x' ? r : (r & 0x3 | 0x8);
    return v.toString(16);
  });
};

export const getDeviceId = (): string => {
  let deviceId = localStorage.getItem(DEVICE_ID_KEY);
  if (!deviceId) {
    // UUID 형식의 고유 ID 생성
    deviceId = 'guest_' + generateUUID();
    localStorage.setItem(DEVICE_ID_KEY, deviceId);
  }
  return deviceId;
};

export const getGuestIndicatorSettings = async (): Promise<string> => {
  try {
    const deviceId = getDeviceId();
    const response = await api.get<string>(`/api/settings/indicator-visibility/guest/${deviceId}`);
    
    // 응답이 객체인 경우 문자열로 변환
    if (typeof response.data === 'object' && response.data !== null) {
      return JSON.stringify(response.data);
    }
    
    return response.data || '{}';
  } catch (error: any) {
    // 403/404 에러는 정상(게스트 설정이 없는 경우) - 경고 수준 로그만
    if (error?.response?.status === 403 || error?.response?.status === 404) {
      console.warn('게스트 보조지표 설정 없음 (정상)');
    } else {
      console.error('게스트 보조지표 설정 조회 실패:', error);
    }
    return '{}';
  }
};

export const saveGuestIndicatorSettings = async (settings: string): Promise<void> => {
  try {
    const deviceId = getDeviceId();
    await api.post(`/api/settings/indicator-visibility/guest/${deviceId}`, { settings });
    console.log('게스트 보조지표 설정 저장 성공');
  } catch (error: any) {
    // 403 에러는 권한 문제 - 조용히 무시
    if (error?.response?.status === 403) {
      console.warn('게스트 보조지표 설정 저장 권한 없음 (정상)');
      return;
    }
    console.error('게스트 보조지표 설정 저장 실패:', error);
    throw error;
  }
};

export const deleteGuestIndicatorSettings = async (): Promise<void> => {
  try {
    const deviceId = getDeviceId();
    await api.delete(`/api/settings/indicator-visibility/guest/${deviceId}`);
  } catch (error) {
    console.error('게스트 보조지표 설정 삭제 실패:', error);
    throw error;
  }
};

// ==================== 차트 색상 설정 API ====================

// 로그인 사용자 - 차트 색상 설정 조회
export const getUserChartColorSettings = async (): Promise<string> => {
  try {
    const response = await api.get<string>('/api/settings/chart-colors');
    console.log('🔍 사용자 차트 색상 설정 API 응답:', response.data, 'type:', typeof response.data);
    
    // 응답이 객체인 경우 문자열로 변환
    if (typeof response.data === 'object' && response.data !== null) {
      return JSON.stringify(response.data);
    }
    
    return response.data || '{}';
  } catch (error) {
    console.error('차트 색상 설정 조회 실패:', error);
    return '{}';
  }
};

// 로그인 사용자 - 차트 색상 설정 저장
export const saveUserChartColorSettings = async (settings: string): Promise<void> => {
  try {
    await api.post('/api/settings/chart-colors', { settings });
    console.log('차트 색상 설정 저장 성공');
  } catch (error) {
    console.error('차트 색상 설정 저장 실패:', error);
    throw error;
  }
};

// 게스트 사용자 - 차트 색상 설정 조회
export const getGuestChartColorSettings = async (): Promise<string> => {
  try {
    const deviceId = getDeviceId();
    const response = await api.get<string>(`/api/settings/chart-colors/guest/${deviceId}`);
    console.log('🔍 게스트 차트 색상 설정 API 응답:', response.data, 'type:', typeof response.data);
    
    // 응답이 객체인 경우 문자열로 변환
    if (typeof response.data === 'object' && response.data !== null) {
      return JSON.stringify(response.data);
    }
    
    return response.data || '{}';
  } catch (error) {
    console.error('게스트 차트 색상 설정 조회 실패:', error);
    return '{}';
  }
};

// 게스트 사용자 - 차트 색상 설정 저장
export const saveGuestChartColorSettings = async (settings: string): Promise<void> => {
  try {
    const deviceId = getDeviceId();
    await api.post(`/api/settings/chart-colors/guest/${deviceId}`, { settings });
    console.log('게스트 차트 색상 설정 저장 성공');
  } catch (error) {
    console.error('게스트 차트 색상 설정 저장 실패:', error);
    throw error;
  }
};

// ==================== 사용자 정의 기준선 API ====================

// 로그인 사용자 - 기준선 설정 조회
export const getUserCustomReferenceLines = async (): Promise<string> => {
  try {
    const response = await api.get<string>('/api/settings/reference-lines');
    console.log('🔍 사용자 기준선 설정 API 응답:', response.data, 'type:', typeof response.data);
    
    // 응답이 객체인 경우 문자열로 변환
    if (typeof response.data === 'object' && response.data !== null) {
      return JSON.stringify(response.data);
    }
    
    return response.data || '{}';
  } catch (error) {
    console.error('기준선 설정 조회 실패:', error);
    return '{}';
  }
};

// 로그인 사용자 - 기준선 설정 저장
export const saveUserCustomReferenceLines = async (referenceLines: string): Promise<void> => {
  try {
    await api.post('/api/settings/reference-lines', { referenceLines });
    console.log('기준선 설정 저장 성공');
  } catch (error) {
    console.error('기준선 설정 저장 실패:', error);
    throw error;
  }
};

// 게스트 사용자 - 기준선 설정 조회
export const getGuestCustomReferenceLines = async (): Promise<string> => {
  try {
    const deviceId = getDeviceId();
    const response = await api.get<string>(`/api/settings/reference-lines/guest/${deviceId}`);
    
    // 응답이 객체인 경우 문자열로 변환
    if (typeof response.data === 'object' && response.data !== null) {
      return JSON.stringify(response.data);
    }
    
    return response.data || '{}';
  } catch (error: any) {
    // 403/404 에러는 정상(게스트 설정이 없는 경우) - 경고 수준 로그만
    if (error?.response?.status === 403 || error?.response?.status === 404) {
      console.warn('게스트 기준선 설정 없음 (정상)');
    } else {
      console.error('게스트 기준선 설정 조회 실패:', error);
    }
    return '{}';
  }
};

// 게스트 사용자 - 기준선 설정 저장
export const saveGuestCustomReferenceLines = async (referenceLines: string): Promise<void> => {
  try {
    const deviceId = getDeviceId();
    await api.post(`/api/settings/reference-lines/guest/${deviceId}`, { referenceLines });
    console.log('게스트 기준선 설정 저장 성공');
  } catch (error: any) {
    // 403 에러는 권한 문제 - 조용히 무시
    if (error?.response?.status === 403) {
      console.warn('게스트 기준선 설정 저장 권한 없음 (정상)');
      return;
    }
    console.error('게스트 기준선 설정 저장 실패:', error);
    throw error;
  }
};

// ==================== 보조지표 기간 설정 API ====================

// 로그인 사용자 - 보조지표 기간 설정 조회
export const getUserIndicatorPeriods = async (): Promise<string> => {
  try {
    const response = await api.get<string>('/api/settings/indicator-periods');
    console.log('🔍 사용자 보조지표 기간 설정 API 응답:', response.data, 'type:', typeof response.data);
    
    // 응답이 객체인 경우 문자열로 변환
    if (typeof response.data === 'object' && response.data !== null) {
      return JSON.stringify(response.data);
    }
    
    return response.data || '{}';
  } catch (error) {
    console.error('보조지표 기간 설정 조회 실패:', error);
    return '{}';
  }
};

// 로그인 사용자 - 보조지표 기간 설정 저장
export const saveUserIndicatorPeriods = async (periods: string): Promise<void> => {
  try {
    await api.post('/api/settings/indicator-periods', { periods });
    console.log('✅ 보조지표 기간 설정 저장 성공');
  } catch (error) {
    console.error('❌ 보조지표 기간 설정 저장 실패:', error);
    throw error;
  }
};

// 게스트 사용자 - 보조지표 기간 설정 조회
export const getGuestIndicatorPeriods = async (): Promise<string> => {
  try {
    const deviceId = getDeviceId();
    const response = await api.get<string>(`/api/settings/indicator-periods/guest/${deviceId}`);
    
    // 응답이 객체인 경우 문자열로 변환
    if (typeof response.data === 'object' && response.data !== null) {
      return JSON.stringify(response.data);
    }
    
    return response.data || '{}';
  } catch (error: any) {
    // 403/404 에러는 정상(게스트 설정이 없는 경우) - 경고 수준 로그만
    if (error?.response?.status === 403 || error?.response?.status === 404) {
      console.warn('게스트 보조지표 기간 설정 없음 (정상)');
    } else {
      console.error('게스트 보조지표 기간 설정 조회 실패:', error);
    }
    return '{}';
  }
};

// 게스트 사용자 - 보조지표 기간 설정 저장
export const saveGuestIndicatorPeriods = async (periods: string): Promise<void> => {
  try {
    const deviceId = getDeviceId();
    await api.post(`/api/settings/indicator-periods/guest/${deviceId}`, { periods });
    console.log('✅ 게스트 보조지표 기간 설정 저장 성공');
  } catch (error: any) {
    // 403 에러는 권한 문제 - 조용히 무시
    if (error?.response?.status === 403) {
      console.warn('게스트 보조지표 기간 설정 저장 권한 없음 (정상)');
      return;
    }
    console.error('❌ 게스트 보조지표 기간 설정 저장 실패:', error);
    throw error;
  }
};

