class window.SharePhotoController extends AuthCtrl
  constructor: (@$scope, @$rootScope, @Dock, @Constants, @$state, @Analytics, @$injector, @$FB, @User, @$http, @Cookies, @Token ,@$timeout, @$modal, @localStorageService) ->
    super()
    @getSite()
    @entryId = @$stateParams.entryId
    @boardId = @$stateParams.boardId
    @instant = @$stateParams.instant
    if @instant
      @$rootScope.shareText = @localStorageService.get('shareText') 
    else
      @localStorageService.remove('shareText')
    @$rootScope.shareText ||= ''
    @getEntry()

  publishInstant: ->
    if @instant && !@Dock.publishInProgress
      @Dock.publishInProgress = true
      if @instant == 'twitter'
        @submitShareTw()
      else
        @submitShareFb()


  onSiteLoad: (data, headers) =>
    super(data, headers)
    @$FB.init
      appId: data.social.facebook_app_id

    if @instant && @Dock.data.userInfo? && @Dock.data.userInfo.social?
      @publishInstant()
    else
      if @instant
        @getUser()


  onGetUser: (data) =>
      console.log "got user" if DEBUG
      @MixPanel = @$injector.get("MixPanel")
      @Dock.setUserInfo(data)
      @MixPanel.setUser(data)
      @getBoard() if @boardId
      if @instant && !@Dock.publishInProgress
        @publishInstant()

  getEntry: =>
    @Entry = @$injector.get("Entry")
    @Entry.query({id: @entryId}, @onGetEntry, @onSiteError)

  onGetEntry: (data) =>
    @Dock.setEntry data
    @$rootScope.shareText ||= data.details.share_message

  onEntryError: (error) =>
    console.log "error is #{error}" if DEBUG
    @showError()

  returnBackAfterShare: (data) =>
    if @$rootScope.returnTo
      @$state.go(@$rootScope.returnTo.route, @$rootScope.returnTo.params)
    else
      @$state.go(@Constants.routes.boardbase, { boardId: @boardId})

  loggedInAndNotRestricted: ->
    @Dock.hasUser() && @Dock.hasUserToken() && !@Dock.data.restrict_api_access    

  submitShareTw: ->
    console.log 'submitShareTw'
    if @loggedInAndNotRestricted()
      console.log "@Dock.data.userInfo", @Dock.data.userInfo
      canPublish = @Dock.data.userInfo.social? && @Dock.data.userInfo.social.twitter.publish
      if canPublish
        console.log 'canPublish = ', canPublish
        @Dock.publishInProgress = true
        @$rootScope.returnTo =
          route: @Constants.routes.viewPhoto
          params:
            boardId: @boardId,
            entryId: @entryId

        @Entry = @$injector.get("Entry")
        params =
          message: @$rootScope.shareText
          provider: 'twitter' # or twitter
        new @Entry(id: @entryId).$share params, (data, headers) =>
          @$rootScope.shareText = ''

          if headers('X-Message-Type')
            text = @decodeMessage(headers)
            type = headers('X-Message-Type')
            modalInstance = @$modal.open
              templateUrl: "@@host/views/alert-#{type}.html",
              controller: 'ModalInstanceController',
              resolve:
                text: -> text
                header: -> false
            modalInstance.result.then @returnBackAfterShare, @returnBackAfterShare
      else
        @requestPublishPermissionsTw()
    else
      @localStorageService.set('shareText', @$rootScope.shareText)
      @$rootScope.returnTo =
        route: @Constants.routes.share_instant
        params:
          entryId: @entryId
          boardId: @boardId
          instant: true
      @$state.go(@Constants.routes.signin, { publish: 'twitter' })


  submitShareFb: ->
    console.log 'submitShareFb'
    if @loggedInAndNotRestricted()
      console.log "@Dock.data.userInfo", @Dock.data.userInfo
      canPublish = @Dock.data.userInfo.social? && @Dock.data.userInfo.social.facebook.publish
      if canPublish
        console.log 'canPublish = ', canPublish
        @Dock.publishInProgress = true
        @$rootScope.returnTo =
          route: @Constants.routes.viewPhoto
          params:
            boardId: @boardId,
            entryId: @entryId

        @Entry = @$injector.get("Entry")
        params =
          message: @$rootScope.shareText
          provider: 'facebook' # or twitter
        new @Entry(id: @entryId).$share params, (data, headers) =>
          @$rootScope.shareText = ''

          if headers('X-Message-Type')
            text = @decodeMessage(headers)
            type = headers('X-Message-Type')
            modalInstance = @$modal.open
              templateUrl: "@@host/views/alert-#{type}.html",
              controller: 'ModalInstanceController',
              resolve:
                text: -> text
                header: -> false
            modalInstance.result.then @returnBackAfterShare, @returnBackAfterShare
      else
        @requestPublishPermissionsFb()
    else
      @$rootScope.returnTo =
        route: @Constants.routes.share_instant
        params:
          entryId: @entryId
          boardId: @boardId
          instant: true
      @$state.go(@Constants.routes.signin, { publish: 'facebook' })

  requestPublishPermissionsFb: ->
    console.log 'SharePhotoController#requestPublishPermissions'
    @$FB.login (response) =>
      console.log "Response from FB.login", response
      @newToken = response.authResponse.accessToken
      @$FB.api '/me', (response) =>
        userInfo =
          first_name: response.first_name
          last_name: response.last_name
          email: response.email
          birthday: response.birthday
          gender: response.gender
        userInfo.location = response.location.name if response.location?
        @Dock.setUserInfo(userInfo)
        @getFbToken(response.email, response.id, @newToken)
    , { scope: 'email, user_birthday, publish_stream' }

  requestPublishPermissionsTw: ->
    @localStorageService.set('shareText', @$rootScope.shareText)
    return_url = "/mobile/share/#{@boardId}/#{@entryId}"
    window.location = "/members/auth/twitter/escalate?return_url=#{return_url}"

  getFbToken: (email, id, token) =>
    console.log 'SharePhotoController#getFbToken'
    params = {email: email, fb_id: id, fb_token: token }
    @$http
      url: "#{apiPrefix}/v2/facebook-token.json"
      method: 'POST'
      data: params
    .success (data) =>
      console.log 'SharePhotoController#getFbToken success', data
      @onToken(data)
      if @newToken
        @$http
          method: 'PATCH'
          url: "#{apiPrefix}/v2/users/update-permissions/facebook"
          headers:
            Authorization: @Dock.getUserToken()
          data:
            fb_token: @newToken
        .success (data) =>
            console.log 'SharePhotoController#getFbToken success', data
            @Dock.data.userInfo = data
            @Dock.data.userInfo.social.facebook.publish = true
            console.log 'Success in getFbToken'
            @submitShare()

  onToken: (data) =>
    if @$rootScope.returnTo
      @$state.go(@$rootScope.returnTo.route, @$rootScope.returnTo.params)
    else
      @$state.go(@Constants.routes.boardbase, { boardId: @boardId })

SharePhotoController.$inject = ["$scope", "$rootScope", "Dock", "Constants", "$state", "Analytics", "$injector", "$FB", "User", "$http", "Cookies", "Token", "$timeout", "$modal", "localStorageService"]

angular.module("shuttlerockApp").controller("SharePhotoController", SharePhotoController)