// Initialize environment variables (loads .env file)
export function initializeEnvironment(): void {
  try {
    require('dotenv').config();
  } catch (error) {
    // dotenv is not installed, continue without it
  }
}

// Auto-initialize on import
initializeEnvironment();

// Main exports
export { ApyFetcher } from './fetcher';

// Types
export type {
  ApyData,
  Protocol,
  ApyResult,
  GroupedApys,
  BestApyResult,
  TokenMapping,
  NetworkTokenMappings,
} from './types';

// Errors
export {
  ApyFetcherError,
  NetworkError,
  ValidationError,
  AuthenticationError,
} from './types';

// Protocols
export { ETHEREUM, POLYGON, ARBITRUM, OPTIMISM } from './protocols';

// Protocols
// export { KaminoProtocol } from './protocols/kamino';
export { AaveEthProtocol } from './protocols/aave-eth';
export { AavePolygonProtocol } from './protocols/aave-polygon';
export { AaveArbitrumProtocol } from './protocols/aave-arbitrum';
export { AaveOptimismProtocol } from './protocols/aave-optimism';

// Convenience function
import { ApyFetcher } from './fetcher';
import { ApyData, ApyResult, Protocol } from './types';
// import { AppConfig } from './config';

/**
 * Simple convenience function to fetch APYs from all protocols
 * @param config Optional configuration, defaults to environment-based config
 * @param gracefulDegradation Continue with other protocols if one fails (default: true)
 * @returns Promise<ApyData[]> Array of APY data from all protocols
 */
export async function getApys(
  protocols?: Protocol[],
  gracefulDegradation: boolean = true
): Promise<ApyData[]> {
  const fetcher = new ApyFetcher(protocols);
  return await fetcher.fetchApys(gracefulDegradation);
}

/**
 * Get APYs with detailed results per protocol
 * @param config Optional configuration, defaults to environment-based config
 * @param gracefulDegradation Continue with other protocols if one fails (default: true)
 * @returns Promise<ApyResult[]> Array of results with success/error status per protocol
 */
export async function getApysWithResults(
  protocols?: Protocol[],
  gracefulDegradation: boolean = true
): Promise<ApyResult[]> {
  const fetcher = new ApyFetcher(protocols);
  return await fetcher.fetchApysWithResults(gracefulDegradation);
}

/**
 * Get the best APY for a specific token across all protocols
 * @param tokenSymbol Token symbol to search for (e.g., 'USDC', 'WETH')
 * @param config Optional configuration, defaults to environment-based config
 * @param gracefulDegradation Continue with other protocols if one fails (default: true)
 * @returns Promise<BestApyResult | null> Best APY result or null if token not found
 */
export async function getBestApyForToken(
  protocols: Protocol[],
  tokenSymbol: string,
  gracefulDegradation: boolean = true
): Promise<import('./types').BestApyResult | null> {
  const fetcher = new ApyFetcher(protocols);
  return await fetcher.getBestApyForToken(tokenSymbol, gracefulDegradation);
} 