module YouTube
  class Routes
    include PageObject::PageFactory
    def initialize(browser, opts = {}, route_array = nil)
      @browser = browser # needed by PageObject::PageFactory
      @opts = opts
      @route_array = route_array
      @route_array ||= @opts[:account] ? switch_account_route : default_route
      set_pageobject_default
    end

    def set_pageobject_default
      PageObject::PageFactory.routes = { # ugly class method, may want to rewrite this as a helper
        default: @route_array
      }
    end

    def default_route
      [
        [YouTube::LoginPage, :login],
        [YouTube::DashboardPage, :select_reports],
        [YouTube::DownloadReportsPage]
      ]
    end

    def switch_account_route
      [
        [YouTube::LoginPage, :login],
        [YouTube::SwitchAccountsPage, :switch_accounts, @opts[:account]],
        [YouTube::DownloadReportsPage]
      ]
    end

    # Public: Instantiate page classes and call instance methods to navigate browser through the site
    #
    # If page navigation is too complex to use routes, you can always instantiate page classes within this method
    # body.
    #
    # Example
    #
    # def traverse(opts = {})
    #   visit(LoginPage).login
    #   opts[:do] == 1 ? on(PageOne).method_one : on(PageOne).method_two
    #   on(PageTwo).do_things(opts)
    # end
    #
    # Returns nothing.
    def traverse
      visit(@route_array.first[0])
      navigate_to(@route_array.last[0]).fetch(@opts)
    end
  end
end
