import { notification_preference } from './user-notification-preferences'

export type Notification = {
  id: string
  userId: string
  reasonText?: string
  reason?: notification_reason_types | notification_preference
  createdTime: number
  viewTime?: number
  isSeen: boolean

  sourceId?: string
  sourceType?: notification_source_types
  sourceUpdateType?: notification_source_update_types
  sourceContractId?: string
  sourceUserName?: string
  sourceUserUsername?: string
  sourceUserAvatarUrl?: string
  sourceText?: string
  data?: { [key: string]: any }

  sourceContractTitle?: string
  sourceContractCreatorUsername?: string
  sourceContractSlug?: string

  sourceSlug?: string
  sourceTitle?: string

  isSeenOnHref?: string
}

export type notification_source_types =
  | 'contract'
  | 'comment'
  | 'bet'
  | 'answer'
  | 'liquidity'
  | 'follow'
  | 'tip'
  | 'admin_message'
  | 'group'
  | 'user'
  | 'bonus'
  | 'challenge'
  | 'betting_streak_bonus'
  | 'loan'
  | 'like'
  | 'tip_and_like'
  | 'badge'

export type notification_source_update_types =
  | 'created'
  | 'updated'
  | 'resolved'
  | 'deleted'
  | 'closed'

/* Optional - if possible use a notification_preference */
export type notification_reason_types =
  | 'tagged_user'
  | 'on_new_follow'
  | 'contract_from_followed_user'
  | 'you_referred_user'
  | 'user_joined_to_bet_on_your_market'
  | 'unique_bettors_on_your_contract'
  | 'tip_received'
  | 'bet_fill'
  | 'user_joined_from_your_group_invite'
  | 'challenge_accepted'
  | 'betting_streak_incremented'
  | 'loan_income'
  | 'liked_and_tipped_your_contract'
  | 'comment_on_your_contract'
  | 'answer_on_your_contract'
  | 'comment_on_contract_you_follow'
  | 'answer_on_contract_you_follow'
  | 'update_on_contract_you_follow'
  | 'resolution_on_contract_you_follow'
  | 'comment_on_contract_with_users_shares_in'
  | 'answer_on_contract_with_users_shares_in'
  | 'update_on_contract_with_users_shares_in'
  | 'resolution_on_contract_with_users_shares_in'
  | 'comment_on_contract_with_users_answer'
  | 'update_on_contract_with_users_answer'
  | 'resolution_on_contract_with_users_answer'
  | 'answer_on_contract_with_users_answer'
  | 'comment_on_contract_with_users_comment'
  | 'answer_on_contract_with_users_comment'
  | 'update_on_contract_with_users_comment'
  | 'resolution_on_contract_with_users_comment'
  | 'reply_to_users_answer'
  | 'reply_to_users_comment'
  | 'your_contract_closed'
  | 'subsidized_your_market'

type notification_descriptions = {
  [key in notification_preference]: {
    simple: string
    detailed: string
    necessary?: boolean
  }
}
export const NOTIFICATION_DESCRIPTIONS: notification_descriptions = {
  all_answers_on_my_markets: {
    simple: 'Answers on your markets',
    detailed: 'Answers on your own markets',
  },
  all_comments_on_my_markets: {
    simple: 'Comments on your markets',
    detailed: 'Comments on your own markets',
  },
  answers_by_followed_users_on_watched_markets: {
    simple: 'Only answers by users you follow',
    detailed: "Only answers by users you follow on markets you're watching",
  },
  answers_by_market_creator_on_watched_markets: {
    simple: 'Only answers by market creator',
    detailed: "Only answers by market creator on markets you're watching",
  },
  betting_streaks: {
    simple: `For prediction streaks`,
    detailed: `Bonuses for predictions made over consecutive days (Prediction streaks)})`,
  },
  comments_by_followed_users_on_watched_markets: {
    simple: 'Only comments by users you follow',
    detailed:
      'Only comments by users that you follow on markets that you watch',
  },
  contract_from_followed_user: {
    simple: 'New markets from users you follow',
    detailed: 'New markets from users you follow',
  },
  limit_order_fills: {
    simple: 'Limit order fills',
    detailed: 'When your limit order is filled by another user',
  },
  loan_income: {
    simple: 'Automatic loans from your predictions in unresolved markets',
    detailed:
      'Automatic loans from your predictions that are locked in unresolved markets',
  },
  market_updates_on_watched_markets: {
    simple: 'All creator updates',
    detailed: 'All market updates made by the creator',
  },
  market_updates_on_watched_markets_with_shares_in: {
    simple: "Only creator updates on markets that you're invested in",
    detailed:
      "Only updates made by the creator on markets that you're invested in",
  },
  on_new_follow: {
    simple: 'A user followed you',
    detailed: 'A user followed you',
  },
  onboarding_flow: {
    simple: 'Emails to help you get started using Manifold',
    detailed: 'Emails to help you learn how to use Manifold',
  },
  probability_updates_on_watched_markets: {
    simple: 'Large changes in probability on markets that you watch',
    detailed: 'Large changes in probability on markets that you watch',
  },
  profit_loss_updates: {
    simple: 'Weekly portfolio updates',
    detailed: 'Weekly portfolio updates',
  },
  referral_bonuses: {
    simple: 'For referring new users',
    detailed: 'Bonuses you receive from referring a new user',
  },
  resolutions_on_watched_markets: {
    simple: 'All market resolutions',
    detailed: "All resolutions on markets that you're watching",
  },
  resolutions_on_watched_markets_with_shares_in: {
    simple: "Only market resolutions that you're invested in",
    detailed:
      "Only resolutions of markets you're watching and that you're invested in",
  },
  subsidized_your_market: {
    simple: 'Your market was subsidized',
    detailed: 'When someone subsidizes your market',
  },
  tagged_user: {
    simple: 'A user tagged you',
    detailed: 'When another use tags you',
  },
  thank_you_for_purchases: {
    simple: 'Thank you notes for your purchases',
    detailed: 'Thank you notes for your purchases',
  },
  tipped_comments_on_watched_markets: {
    simple: 'Only highly tipped comments on markets that you watch',
    detailed: 'Only highly tipped comments on markets that you watch',
  },
  tips_on_your_comments: {
    simple: 'Tips on your comments',
    detailed: 'Tips on your comments',
  },
  tips_on_your_markets: {
    simple: 'Tips/Likes on your markets',
    detailed: 'Tips/Likes on your markets',
  },
  trending_markets: {
    simple: 'Weekly interesting markets',
    detailed: 'Weekly interesting markets',
  },
  unique_bettors_on_your_contract: {
    simple: 'For unique predictors on your markets',
    detailed: 'Bonuses for unique predictors on your markets',
  },
  your_contract_closed: {
    simple: 'Your market has closed and you need to resolve it (necessary)',
    detailed: 'Your market has closed and you need to resolve it (necessary)',
    necessary: true,
  },
  all_comments_on_watched_markets: {
    simple: 'All new comments',
    detailed: 'All new comments on markets you follow',
  },
  all_comments_on_contracts_with_shares_in_on_watched_markets: {
    simple: `Only on markets you're invested in`,
    detailed: `Comments on markets that you're watching and you're invested in`,
  },
  all_replies_to_my_comments_on_watched_markets: {
    simple: 'Only replies to your comments',
    detailed: "Only replies to your comments on markets you're watching",
  },
  all_replies_to_my_answers_on_watched_markets: {
    simple: 'Only replies to your answers',
    detailed: "Only replies to your answers on markets you're watching",
  },
  all_answers_on_watched_markets: {
    simple: 'All new answers',
    detailed: "All new answers on markets you're watching",
  },
  all_answers_on_contracts_with_shares_in_on_watched_markets: {
    simple: `Only on markets you're invested in`,
    detailed: `Answers on markets that you're watching and that you're invested in`,
  },
  badges_awarded: {
    simple: 'New badges awarded',
    detailed: 'New badges you have earned',
  },
  opt_out_all: {
    simple: 'Opt out of all notifications (excludes when your markets close)',
    detailed:
      'Opt out of all notifications excluding your own market closure notifications',
  },
}

export type BettingStreakData = {
  streak: number
  bonusAmount: number
}

export type BetFillData = {
  betOutcome: string
  creatorOutcome: string
  probability: number
  fillAmount: number
  limitOrderTotal?: number
  limitOrderRemaining?: number
}

export type ContractResolutionData = {
  outcome: string
  userPayout: number
  userInvestment: number
}