Source: models/session.js

module.exports = Session

var constants = require('../lib/constants')
var Snapchat = require('../')
var User = require('./user')
var Conversation = require('./conversation')
var UserStory = require('./user-story')
var StoryCollection = require('./story-collection')

/**
 * Snapchat Session
 *
 * @class
 * @param {Snapchat} client
 * @param {Object} params
 */
function Session (client, params) {
  var self = this
  if (!(self instanceof Session)) return new Session(client, params)
  if (!(client instanceof Snapchat)) throw new Error('invalid client')

  self.client = client

  var storiesResponse = params['stories_response']
  var friendsResponse = params['friends_response']
  var updatesResponse = params['updates_response']
  var identity = params['identity_check_response']
  var features = updatesResponse['feature_settings']
  var discover = params['discover']
  var messagingGate = params['messaging_gateway_info']

  var friendStories = storiesResponse['friend_stories'] || []
  var myStories = storiesResponse['my_stories'] || []
  // var groupStories = storiesResponse['my_group_stories'] || []

  var friends = friendsResponse['friends'] || []
  var addedFriends = friendsResponse['added_friends'] || []
  var conversations = params['conversations_response'] || []

  self.backgroundFetchSecret = params['background_fetch_secret_key']
  self.bestFriendUsernames = friendsResponse['bests'] || []

  self.storiesDelta = !!storiesResponse['friend_stories_delta']
  self.emailVerified = !!identity['is_email_verified']
  self.highAccuracyRequiredForNearby = !!identity['is_high_accuracy_required_for_nearby']
  self.requirePhonePasswordConfirmed = !!identity['require_phone_password_confirmed']
  self.redGearDurationMilliseconds = +identity['red_gear_duration_millis']
  self.suggestedFriendFetchThresholdHours = identity['suggested_friend_fetch_threshold_hours'] | 0

  self.messagingGatewayAuth = messagingGate['gateway_auth_token']
  self.messagingGatewayServer = messagingGate['gateway_server']

  // Discover
  self.discoverSupported = (discover['compatibility'] === 'supported')
  self.discoverSharingEnabled = !!discover['sharing_enabled']
  self.discoverGetChannels = discover['get_channels']
  self.discoverResourceParamName = discover['resource_parameter_name']
  self.discoverResourceParamValue = discover['resource_parameter_value']
  self.discoverVideoCatalog = discover['video_catalog']

  // Friends
  self.friends = friends.map(function (friend) {
    return new User(friend)
  })

  // Added friends
  self.addedFriends = addedFriends.map(function (friend) {
    return new User(friend)
  })

  // Conversations
  self.conversations = conversations.map(function (conversation) {
    return new Conversation(conversation)
  })

  // Story collections
  self.stories = friendStories.map(function (collection) {
    return new StoryCollection(self.client, collection)
  })

  // User stories
  self.userStories = myStories.map(function (story) {
    return new UserStory(story)
  })

  // Group stories?
  self.groupStories = [ ] // TODO

  // Added me but not added back
  self.pendingRequests = [ ] // TODO

  // Cash info
  self.canUseCash = !!updatesResponse['allowed_to_use_cash']
  self.isCashActive = !!updatesResponse['is_cash_active']
  self.cashCustomerIdentifier = updatesResponse['cash_customer_id']
  self.cashClientProperties = updatesResponse['client_properties']
  self.cashProvider = updatesResponse['cash_provider']

  // Basic user info
  self.username = updatesResponse['username']
  self.email = updatesResponse['email']
  self.mobileNumber = updatesResponse['mobile']
  self.recieved = updatesResponse['recieved'] | 0
  self.sent = updatesResponse['sent'] | 0
  self.score = updatesResponse['score'] | 0
  self.recents = updatesResponse['recents'] || []
  self.requests = updatesResponse['requests'] || []

  // Account information
  self.addedFriendsTimestamp = new Date(updatesResponse['added_friends_timestamp'])
  self.authToken = updatesResponse['auth_token']
  self.canSeeMatureContent = !!updatesResponse['can_view_mature_content']
  self.countryCode = updatesResponse['country_code'] || 'US'
  self.lastTimestamp = new Date(updatesResponse['cash_provider'])
  self.devicetoken = updatesResponse['device_token']
  self.canSaveStoryToGallery = !!updatesResponse['enable_save_story_to_gallery']
  self.canVideoTranscodingAndroid = !!updatesResponse['enable_video_transcoding_android']
  self.imageCaption = !!updatesResponse['image_caption']
  self.requireRefreshingProfileMedia = !!updatesResponse['require_refreshing_profile_media']
  self.isTwoFAEnabled = !!updatesResponse['is_two_fa_enabled']
  self.lastAddressBookUpdateDate = new Date(updatesResponse['last_address_book_updated_date'])
  self.lastReplayedSnapDate = new Date(updatesResponse['last_replayed_snap_timestamp'])
  self.logged = !!updatesResponse['logged']
  self.mobileVerificationKey = updatesResponse['mobile_verification_key']
  self.canUploadRawThumbnail = !!updatesResponse['raw_thumbnail_upload_enabled']
  self.seenTooltips = updatesResponse['seen_tooltips']
  self.shouldCallToVerifyNumber = !!updatesResponse['should_call_to_verify_number']
  self.shouldTextToVerifyNumber = !!updatesResponse['should_send_text_to_verify_number']
  self.snapchatPhoneNumber = updatesResponse['snapchat_phone_number']
  self.studySettings = updatesResponse['study_settings']
  self.targeting = updatesResponse['targeting']
  self.userIdentifier = updatesResponse['user_id']
  self.videoFiltersEnabled = !!updatesResponse['video_filters_enabled']
  self.QRPath = updatesResponse['qr_path']

  // Preferences
  self.enableNotificationSounds = !!updatesResponse['notification_sound_setting']
  self.numberOfBestFriends = updatesResponse['number_of_best_friends'] | 0
  self.privacyEveryone = !updatesResponse['snap_p']
  self.isSearchableByPhoneNumber = !!updatesResponse['searchable_by_phone_number']
  // self.storyPrivacy = SKStoryPrivacyFromString(updatesResponse['story_privacy']) // TODO

  // Features
  self.enableFrontFacingFlash = !!features[constants.featureSettings.frontFacingFlash]
  self.enablePowerSaveMode = !!features[constants.featureSettings.powerSaveMode]
  self.enableReplaySnaps = !!features[constants.featureSettings.replaySnaps]
  self.enableSmartFilters = !!features[constants.featureSettings.smartFilters]
  self.enableSpecialText = !!features[constants.featureSettings.specialText]
  self.enableSwipeCashMode = !!features[constants.featureSettings.swipeCashMode]
  self.enableVisualFilters = !!features[constants.featureSettings.visualFilters]
  self.enableTravelMode = !!features[constants.featureSettings.travelMode]
}

/**
 * @param {string} username
 * @return {User|null}
 */
Session.prototype.getFriend = function (username) {
  var self = this

  for (var i = 0; i < self.friends.length; ++i) {
    var friend = self.friends[i]

    if (friend.username === username) {
      return friend
    }
  }

  return null
}

/**
 * @param  {string} username
 * @return {Story|null}
 */
Session.prototype.getStory = function (username) {
  var self = this

  for (var i = 0; i < self.stories.length; i++) {
    var story = self.stories[i]

    if (story.username === username) {
      return story
    }
  }

  return null
}