export * from './ClusterEntity';
export * from './OwnerEntity';
export * from './TokenEntity';
export * from './StrategyEntity';
export * from './ShareMintEntity';
export * from './ShareHolderEntity';
export * from './StrategyStateEntity';
export * from './WhirlpoolEntity';
export * from './WhirlpoolStateEntity';
export * from './DexTypeEntity';
export * from './VaultEntity';
export * from './RewardEntity';
export * from './RewardEarnedEntity';
export * from './PriceEntity';
export * from './TokenHistoryEntity';
export * from './TokenHistorySourceEntity';
export * from './TokenHistoryFieldEntity';
export * from './ProgramAccountEntity';
export * from './TokenMintEntity';
export * from './TradeAggregatorEntity';
export * from './TradeEntity';
export * from './TradeSourceEntity';
export * from './StrategyMetricsEntity';
export * from './TradePoolEntity';
export * from './SimulatorPoolEntity';
export * from './MetricsSourceEntity';
export * from './KlendMarketEntity';
export * from './KlendMarketStateEntity';
export * from './KlendObligationEntity';
export * from './KLendObligationStateEntity';
export * from './KlendReserveEntity';
export * from './KlendReserveStateEntity';
export * from './KaminoInstructionEntity';
export * from './InstructionEntity';
export * from './UserMetricsEntity';
export * from './PriceTypeEntity';
export * from './FarmEntity';
export * from './FarmStateEntity';
export * from './FarmUserEntity';
export * from './FarmUserStateEntity';
export * from './FarmRewardEntity';
export * from './KlendLeverageMetricsEntity';
export * from './PointsTotalEntity';
export * from './PointsKlendEntity';
export * from './PointsStrategiesEntity';
export * from './PointsSourceEntity';
export * from './KlendObligationTypeEntity';
export * from './StakedSolTokenEntity';
export * from './StablecoinTokenEntity';
export * from './PointsLeaderboardBlacklistEntity';
export * from './KlendInstructionEntity';
export * from './RawInstructionEntity';
export * from './YieldEntity';
export * from './StakingRateEntity';
export * from './PointsTotalHistoryEntity';
export * from './AirdropMetricsEntity';
export * from './AirdropSourceEntity';
export * from './AirdropEntity';
export * from './PointsSourceBoostEntity';
export * from './PointsOwnerBoostEntity';
export * from './PointsOwnerBoostSourceEntity';
export * from './StakingBoostEntity';
export * from './PointsStakingEntity';
export * from './OwnerScreeningEntity';
export * from './accounting';
export * from './RecentSlotEntity';
export * from './EpochEntity';
export * from './StakingYieldEntity';
export * from './kvault';
export * from './limo';
export * from './KlendNotificationEntity';
export * from './NotificationTypeEntity';
export * from './OwnerNetValueEntity';
export * from './kswap';
export * from './referral';
export * from './LookupTableEntity';
export * from './LookupTableAccountEntity';
export * from './OwnerScreeningAuditLogEntity';
export * from './OwnerScreeningConfigEntity';
export * from './ReplaySampleEntity';
export * from './RewardKvaultEntity';
export * from './RewardKvaultMetricsEntity';

export const CLUSTER_TABLE: string = 'cluster';
export const DEX_TYPE: string = 'dex_type';
export const OWNER_TABLE: string = 'owner';
export const VAULT_TABLE: string = 'vault';
export const TOKEN_TABLE: string = 'token';
export const STRATEGY_TABLE: string = 'strategy';
export const SHARE_MINT_TABLE: string = 'share_mint';
export const STRATEGY_STATE_TABLE: string = 'strategy_state';
export const SHARE_HOLDER_TABLE: string = 'share_holder';
export const WHIRLPOOL_TABLE: string = 'whirlpool';
export const WHIRLPOOL_STATE_TABLE: string = 'whirlpool_state';
export const REWARD_TABLE = 'reward';
export const REWARD_EARNED_TABLE = 'reward_earned';
export const PRICE_TABLE = 'price';
export const TOKEN_HISTORY_TABLE = 'token_history';
export const TOKEN_HISTORY_FIELD_TABLE = 'token_history_field';
export const TOKEN_HISTORY_SOURCE_TABLE = 'token_history_source';
export const TRADE_TABLE = 'trade';
export const TOKEN_MINT_TABLE = 'token_mint';
export const PROGRAM_ACCOUNT_TABLE = 'program_account';
export const TRADE_AGGREGATOR_TABLE = 'trade_aggregator';
export const TRADE_SOURCE_TABLE = 'trade_source';
export const TRADE_POOL_TABLE = 'trade_pool';
export const STRATEGY_METRICS_TABLE = 'strategy_metrics';
export const SIMULATOR_POOL_TABLE = 'simulator_pool';
export const METRICS_SOURCE_TABLE = 'metrics_source';
export const KLEND_MARKET_TABLE = 'klend_market';
export const KLEND_RESERVE_TABLE = 'klend_reserve';
export const KLEND_OBLIGATION_TABLE = 'klend_obligation';
export const KLEND_MARKET_STATE_TABLE = 'klend_market_state';
export const KLEND_RESERVE_STATE_TABLE = 'klend_reserve_state';
export const KLEND_OBLIGATION_STATE_TABLE = 'klend_obligation_state';
export const INSTRUCTION_TABLE = 'instruction';
export const USER_METRICS_TABLE = 'user_metrics';
export const PRICE_TYPE_TABLE = 'price_type';
export const FARM_TABLE = 'farm';
export const FARM_STATE_TABLE = 'farm_state';
export const FARM_USER_TABLE = 'farm_user';
export const FARM_USER_STATE_TABLE = 'farm_user_state';
export const FARM_REWARD_TABLE = 'farm_reward_state';
export const KLEND_LEVERAGE_METRICS_TABLE = 'klend_leverage_metrics';
export const POINTS_SOURCE_TABLE = 'points_source';
export const KLEND_OBLIGATION_TYPE_TABLE = 'klend_obligation_type';
export const POINTS_STRATEGIES_TABLE = 'points_strategies';
export const POINTS_KLEND_TABLE = 'points_klend';
export const POINTS_TOTAL_TABLE = 'points_total';
export const POINTS_LEADERBOARD_TABLE = 'points_leaderboard';
export const STAKED_SOL_TOKEN_TABLE = 'staked_sol_token';
export const POINTS_LEADERBOARD_BLACKLIST_TABLE = 'points_leaderboard_blacklist';
export const STABLECOIN_TOKEN_TABLE = 'stablecoin_token';
export const RAW_INSTRUCTION_TABLE = 'raw_instruction';
export const KAMINO_INSTRUCTION_TABLE = 'kamino_instruction';
export const KLEND_INSTRUCTION_TABLE = 'klend_instruction';
export const YIELD_TABLE = 'yield';
export const STAKING_RATE_TABLE = 'staking_rate';
export const POINTS_TOTAL_HISTORY_TABLE = 'points_total_history';
export const AIRDROP_TABLE = 'airdrop';
export const AIRDROP_METRICS_TABLE = 'airdrop_metrics';
export const AIRDROP_SOURCE_TABLE = 'airdrop_source';
export const POINTS_SOURCE_BOOST_TABLE = 'points_source_boost';
export const POINTS_OWNER_BOOST_SOURCE_TABLE = 'points_owner_boost_source';
export const POINTS_OWNER_BOOST_TABLE = 'points_owner_boost';
export const STAKING_BOOST_TABLE = 'staking_boost';
export const POINTS_STAKING_TABLE = 'points_staking';
export const OWNER_SCREENING_TABLE = 'owner_screening';
export const ACCOUNTING_CONFIG_TABLE = 'accounting_config';
export const ACCOUNTING_TRANSACTION_TABLE = 'accounting_transaction';
export const ACCOUNTING_BALANCE_TABLE = 'accounting_balance';
export const RECENT_SLOT_TABLE = 'recent_slot';
export const STAKING_YIELD_TABLE = 'staking_yield';
export const EPOCH_TABLE = 'epoch';
export const KVAULT_TABLE = 'kvault';
export const KVAULT_HOLDER_TABLE = 'kvault_holder';
export const KVAULT_HOLDER_TOTAL_TABLE = 'kvault_holder_total';
export const KVAULT_INSTRUCTION_TABLE = 'kvault_instruction';
export const KVAULT_STATE_TABLE = 'kvault_state';
export const KVAULT_RESERVE_STATE_TABLE = 'kvault_reserve_state';
export const KVAULT_ALLOCATION_STATE_TABLE = 'kvault_allocation_state';
export const KVAULT_RESERVE_REWARD_STATE_TABLE = 'kvault_reserve_reward_state';
export const KVAULT_REWARD_STATE_TABLE = 'kvault_reward_state';
export const KVAULT_METRICS_TABLE = 'kvault_metrics';
export const LIMO_ORDER_TABLE = 'limo_order';
export const LIMO_ORDER_STATUS_TABLE = 'limo_order_status';
export const LIMO_ORDER_TYPE_TABLE = 'limo_order_type';
export const LIMO_INSTRUCTION_TABLE = 'limo_instruction';
export const LIMO_METRICS_TABLE = 'limo_metrics';
export const LIMO_WEEKLY_LEADERBOARD_TABLE = 'limo_weekly_leaderboard';
export const KLEND_NOTIFICATION_TABLE = 'klend_notification';
export const NOTIFICATION_TYPE_TABLE = 'notification_type';
export const OWNER_NET_VALUE_TABLE = 'owner_net_value';
export const KSWAP_TOKEN_TABLE = 'kswap_token';
export const REFERRAL_CODE_TABLE = 'referral_code';
export const REFERRED_OWNER_TABLE = 'referred_owner';
export const REFERRAL_LEADERBOARD_TABLE = 'referral_leaderboard';
export const KSWAP_INSTRUCTION_TABLE = 'kswap_instruction';
export const KSWAP_LEADERBOARD_TABLE = 'kswap_leaderboard';
export const KSWAP_AGGREGATOR_TABLE = 'kswap_aggregator';
export const LOOKUP_TABLE = 'lookup_table';
export const LOOKUP_TABLE_ACCOUNT = 'lookup_table_account';
export const OWNER_SCREENING_AUDIT_LOG_TABLE = 'owner_screening_audit_log';
export const OWNER_SCREENING_CONFIG_TABLE = 'owner_screening_config';
export const REPLAY_SAMPLE_TABLE = 'replay_sample';
export const REWARD_KVAULT_TABLE = 'reward_kvault';
export const REWARD_KVAULT_METRICS_TABLE = 'reward_kvault_metrics';

export type RESAMPLE_FREQUENCY = 'hour' | 'day';
export const HOURLY_FREQUENCY = 'hour';
export const DAILY_FREQUENCY = 'day';

function validateFrequency(frequency: RESAMPLE_FREQUENCY) {
  if (frequency !== HOURLY_FREQUENCY && frequency !== DAILY_FREQUENCY) {
    throw Error(`Frequency ${frequency} not supported`);
  }
}
export const GET_OBLIGATION_STATE_RESAMPLED_TABLE = (frequency: RESAMPLE_FREQUENCY) => {
  validateFrequency(frequency);
  return `klend_obligation_state_resampled_${frequency}`;
};
export const GET_KVAULT_STATE_RESAMPLED_TABLE = (frequency: RESAMPLE_FREQUENCY) => {
  validateFrequency(frequency);
  return `${KVAULT_STATE_TABLE}_${frequency}`;
};
export const GET_KVAULT_HOLDER_RESAMPLED_TABLE = (frequency: RESAMPLE_FREQUENCY) => {
  validateFrequency(frequency);
  return `${KVAULT_HOLDER_TABLE}_${frequency}`;
};
export const GET_KVAULT_HOLDER_TOTAL_RESAMPLED_TABLE = (frequency: RESAMPLE_FREQUENCY) => {
  validateFrequency(frequency);
  return `${KVAULT_HOLDER_TOTAL_TABLE}_${frequency}`;
};
export const GET_KVAULT_RESERVE_STATE_RESAMPLED_TABLE = (frequency: RESAMPLE_FREQUENCY) => {
  validateFrequency(frequency);
  return `${KVAULT_RESERVE_STATE_TABLE}_${frequency}`;
};
export const GET_KVAULT_ALLOCATION_STATE_RESAMPLED_TABLE = (frequency: RESAMPLE_FREQUENCY) => {
  validateFrequency(frequency);
  return `${KVAULT_ALLOCATION_STATE_TABLE}_${frequency}`;
};
export const GET_KVAULT_RESERVE_REWARD_STATE_RESAMPLED_TABLE = (frequency: RESAMPLE_FREQUENCY) => {
  validateFrequency(frequency);
  return `${KVAULT_RESERVE_REWARD_STATE_TABLE}_${frequency}`;
};
export const GET_KVAULT_REWARD_STATE_RESAMPLED_TABLE = (frequency: RESAMPLE_FREQUENCY) => {
  validateFrequency(frequency);
  return `${KVAULT_REWARD_STATE_TABLE}_${frequency}`;
};
export const GET_OWNER_NET_VALUE_TABLE = (frequency: RESAMPLE_FREQUENCY) => {
  validateFrequency(frequency);
  return `owner_net_value_${frequency}`;
};
export const GET_OWNER_NET_VALUE_RESAMPLED_TABLE = (frequency: RESAMPLE_FREQUENCY) => {
  validateFrequency(frequency);
  return `${OWNER_NET_VALUE_TABLE}_${frequency}`;
};
export const GET_STRATEGY_STATE_RESAMPLED_TABLE = (frequency: RESAMPLE_FREQUENCY) => {
  validateFrequency(frequency);
  return `${STRATEGY_STATE_TABLE}_${frequency}`;
};
export const GET_PRICE_RESAMPLED_TABLE = (frequency: RESAMPLE_FREQUENCY) => {
  validateFrequency(frequency);
  return `${PRICE_TABLE}_${frequency}`;
};

export const API_SCHEMA: string = 'api';
