class @BaseCtrl
    constructor: () ->
        @$rootScope ||= @$injector.get('$rootScope')

        @$rootScope.flashText = null
        @$rootScope.flashType = null

        @$stateParams = @$injector.get("$stateParams")
        @boardId = @$stateParams.boardId
        console.log "board id is #{@boardId}" if DEBUG
        @$rootScope = @$injector.get("$rootScope")
        @$rootScope.bodyClasses = @bodyClasses
        @$rootScope.index = false
        @$rootScope.hideNavbar = false
        @$rootScope.hideButtons = false
        @$location = @$injector.get("$location")
        @$rootScope.location = @$location
        if @Dock.hasUserToken() && !@Dock.hasUser()
          @getUser()
        else
          if @boardId? && !@Dock.hasBoard()
            @getBoard()

    getBoard: =>
        @Board = @$injector.get("Board")
        @Board.get({id: @boardId}, @onGetBoard, @onSiteError)

    onGetBoard: (data) =>
        console.log "got boards", data if DEBUG
        @Dock.setBoard(data)
        @$rootScope.description = @Dock.data.board.description

    getUser: ->
        @User = @$injector.get("User")
        @User.query(@onGetUser, @onGetUserError)

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

    onGetUserError: (error) =>
        console.log error if DEBUG
        @$state.go(@Constants.routes.error)

    onTokenError: (error) =>
        @incorrectPassword = true

    bodyClasses: ->
        'sr-skin-default'

    getSite: =>
        @Site = @$injector.get("Site") #make sure to have $injector injected in child class
        @Site.get(@onSiteLoad, @onSiteError)

    onSiteLoad: (data, headers) =>
        console.log "onSiteLoad data = ", data if DEBUG
        @$rootScope.siteTitle = data.details.name
        @$rootScope.siteName = data.details.name
        @$rootScope.favicon = data.images.square
        @$rootScope.logo = data.images.square
        @$rootScope.backgroundImage = data.mobile.background
        @$rootScope.customCss = data.mobile.css
        @Analytics = @$injector.get('Analytics')
        @Analytics.init(data.details.google_analytics_code)
        @Dock.setSiteData(data)
        if headers('X-Message-Type') == 'important_notice'
            console.log "headers('X-Message-Body') = ", headers('X-Message-Body')
            text = @decodeMessage(headers)
            @setLocale(text)

    decodeMessage: (headers) =>
        unescape(decodeURIComponent(headers('X-Message-Body')))

    setLocale: (text) =>
        @$modal ||= @$injector.get('$modal')
        modalInstance = @$modal.open
          templateUrl: "@@host/views/alert-important-notice.html",
          controller: 'ModalInstanceController',
          resolve:
            text:   -> text
            header: -> false
        modalInstance.result.then @setupCloseAction, @setupCloseAction

    setupCloseAction: (result) =>
        @Cookies ||= @$injector.get('Cookies')
        anotherLocale = if locale == 'en' then 'ja' else 'en'
        if result == 'ok'
            @Cookies.setItem('locale', anotherLocale, 31536e3, '/')
        else
            @Cookies.setItem('locale', locale, 31536e3, '/')
        @Cookies.setItem('locale_selected', '1', 31536e3, '/')
        $window = @$injector.get('$window')
        $window.location.reload()
        true

    hasBoardId: =>
        !!@boardId

    onSiteError: (error) =>
        console.log error if DEBUG
        # Rollbar.error("Something went wrong", error);
        if error.status == 403
            @$state.go(@Constants.routes.siteauth)
        else
            @$state.go(@Constants.routes.error)

    isArray: (o) ->
        Object::toString.call(o) is "[object Array]"

    uploadNewPhoto: =>
        #remove entry first
        @Dock.removeEntry()

        #if there's a list of boards, show them, else go straight to upload
        if @Dock.getNumberOfBoards() > 0 || not @boardId?
            @$state.go(@Constants.routes.home)
        else
            @Dock.setBoardFromId(@boardId)
            @$state.go(@Constants.routes.boardbase, {boardId: @boardId})

    showPreloader: ->
        @$rootScope.showPreloader = true

    hidePreloader: ->
        @$rootScope.showPreloader = false

    # TODO: Move to directive
    nudgePreloader: ->
        #webkit doesn't always apply styles all the way through after animating part of the screen
        pre = $('.preloader')
        pre.css("display", "inline-block")
        pre.css("offsetHeight")   # no need to store this anywhere, the reference is enough
        pre.css("display", "inline-block")

    setForwardSlide: ->
        $('.slide-container').removeClass('lr')
        $('.slide-container').addClass('rl')

    setGoBackSlide: ->
        $('.slide-container').removeClass('lr')
        $('.slide-container').addClass('rl')

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