class window.SignInCtrl extends AuthCtrl
  constructor: (@$rootScope, @$scope, @$http, @$state, @$injector, @Cookies, @Dock, @Token, @Analytics, @Constants, @FbToken, @$window, @$FB, @$modal, @$translate) ->
    super()
    @getSite()
    @forPublish = ( @$stateParams.publish == 'facebook' || @$stateParams.publish == 'twitter' )
    @provider = @$stateParams.publish if @forPublish
    @forVote = ( @$stateParams.publish == 'vote' )
    @Dock.data.userInfo || = {}
    @Dock.data.userInfo.subscribed = true

    if @forPublish
      @$modal.open
        templateUrl: "@@host/views/alert-notice.html",
        controller: 'ModalInstanceController',
        resolve:
          text: -> 
            "Please sign in to finish sharing this entry."
          header: -> 
            "Nearly finished!"
    if @$rootScope.returnTo? && @$rootScope.returnTo.route == @Constants.routes.vote_instant
      @$modal.open
        templateUrl: "@@host/views/alert-notice.html",
        controller: 'ModalInstanceController',
        resolve:
          text: -> 
            "Please sign in with Facebook or your email address to finish voting for this entry."
          header: -> 
            "Nearly finished!"

  canLoginViaFb: ->
    ( @provider == 'facebook' ) || !@forPublish

  canLoginViaTw: ->
    ( @provider == 'twitter' ) || !@forPublish

  continue: =>
    if @$scope.emailForm.$valid
      @hasError = false
      @showPreloader()
      @getToken()
    else
      @hasError = true

  onToken: (data) =>
    console.log "Signin#onToken enter", data
    @Dock.setUserToken('token '+data.token)
    @Dock.setApiRestriction(data.restrict_api_access)
    @updateUser('token '+data.token)
    @Dock.data.userInfo.password = ''

  onUpdateUser: (data) =>
    console.log "Signin#onUpdateUser", data
    @Cookies.setItem('sr_token', @Dock.getUserToken(), 31536e3, '/')
    @Cookies.setItem('sr_api_restriction', @Dock.getApiRestriction(), 31536e3, '/') 
    @Dock.setUserInfo(data)
    @MixPanel = @$injector.get("MixPanel") #make sure to have $injector injected in child class
    @MixPanel.userSignup(data)
    if @forPublish && @newToken? && @newToken
      @$http
        method: 'PATCH'
        url: "#{apiPrefix}/v2/users/update-permissions/facebook"
        headers:
          Authorization: @Dock.getUserToken()
        data:
          fb_token: @newToken
      .success =>
        @Dock.data.userInfo.social.facebook.publish = true
        if @$rootScope.returnTo
          @$state.go(@$rootScope.returnTo.route, @$rootScope.returnTo.params)
        else
          @$state.go(@Constants.routes.home)
        @Dock.data.userInfo.social.facebook.publish = true if @forPublish
      .error =>
        params = {email: @Dock.data.userInfo.email, password: @Dock.data.userInfo.password}
        @Token.save {}, params, (data) =>
          @Dock.setUserToken('token '+data.token)
          if @$rootScope.returnTo
            @$state.go(@$rootScope.returnTo.route, @$rootScope.returnTo.params)
          else
            @$state.go(@Constants.routes.home)    
    else
      console.log "@$rootScope.returnTo = ", @$rootScope.returnTo
      if @$rootScope.returnTo
        @$state.go(@$rootScope.returnTo.route, @$rootScope.returnTo.params)
      else
        @$state.go(@Constants.routes.home)

  fbLogin: =>
    scope = 'email, user_birthday'
    scope += ', publish_stream' if @forPublish
    @$FB.login (response) =>
      if response.status == 'connected'
        token = response.authResponse.accessToken
        @newToken = token
        @$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?
          userInfo.subscribed = @Dock.data.userInfo.subscribed
          @Dock.setUserInfo(userInfo)
          @getFbToken(response.email, response.id, token)
    , { scope: scope }

  twLogin: =>
    console.log "TWITTER LOGIN"
    console.log "@$rootScope.returnTo", @$rootScope.returnTo
    if @$rootScope.returnTo?
      console.log 'Logging in via twitter with publish rights and return to instant share'
      return_url = "/mobile/share/#{@$rootScope.returnTo.params.boardId}/#{@$rootScope.returnTo.params.entryId}/twitter"
      window.location = "/members/auth/twitter/escalate?return_url=#{return_url}"
    else
      @$state.go(@Constants.routes.twauth)

  getFbToken: (email, id, token) =>
    console.log "Signin#getFBToken enter"
    params = {email: email, fb_id: id, fb_token: token }
    @$http
      url: "#{@$window.apiPrefix}/v2/facebook-token.json"
      method: 'POST'
      data: params
    .success (data) =>
      @onToken(data)
  
  onSiteLoad: (data, headers) =>
    super(data, headers)
    @$FB.init
      appId: data.social.facebook_app_id

  gotoForgot: =>
    @$state.go(@Constants.routes.resetPassword)


SignInCtrl.$inject = ["$rootScope", "$scope", "$http", "$state", "$injector", "Cookies", "Dock", "Token", "Analytics", "Constants", "FbToken", "$window", '$FB', '$modal', '$translate']

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