
module SharedMethods
  def visit_default_params
    {
      room_restore_delay: 3,
    }
  end

  def visit_core(params = {})
    params = visit_default_params.merge(params)
    visit_to("/share-board", params)
  end

  def visit_app(params = {})
    visit_core(params)

    params = params.to_options
    if !params[:__visit_app_warning_skip__]
      if params[:room_key] && params[:user_name]
        warn "room_key と user_name がある場合は visit_room を使うこと"
        puts caller.first
      end
    end
  end

  def visit_room(params = {})
    params = {
      :room_key => :test_room,
    }.merge(params)

    visit_core(params)

    if true
      params = params.to_options
      if params[:autoexec_room_create_after] == "os_modal_open_handle"
        warn "assert_room_created が必ず失敗するので autoexec_room_create_after=os_modal_open_handle は使えない"
        puts caller.first
      end
    end

    assert_room_created
  end

  def room_setup(room_key, user_name, params = {})
    params = {
      :shuffle_first => false,     # テストにランダム要素が含まれると混乱するため初期値では入室順に順序が決まるようにする
    }.merge(params)

    visit_app(params)
    room_menu_open_and_input(room_key, user_name)
  end

  def room_setup_by_user(user_name, params = {})
    params = {
      :room_key => :test_room,
    }.merge(params.to_options)

    room_key = params.delete(:room_key)
    room_setup(room_key, user_name, params)
  end

  def room_menu_open_and_input(room_key, user_name)
    global_menu_open
    gate_modal_open_handle                               # 「入退室」を自分でクリックする
    Capybara.within(".GateModal") do
      find(".new_room_key input").set(room_key)   # 合言葉を入力する
      find(".new_user_name input").set(user_name) # ハンドルネームを入力する
      find(".gate_enter_handle").click            # 入室ボタンをクリックする
      find(".close_handle").click                 # 閉じる
    end
    assert_text(user_name)                        # 入力したハンドルネームの人が参加している
    assert_room_created
  end

  def room_setup_by_fillin_params
    global_menu_open
    gate_modal_open_handle                  # 「入退室」を自分でクリックする
    Capybara.within(".GateModal") do
      find(".gate_enter_handle").click            # 入室ボタンをクリックする
      find(".close_handle").click                 # 閉じる
    end
    assert_room_created
  end

  def room_auto_enter_but_confirm
    assert_selector(".GateModal")               # 「入退室」のモーダルが自動的に表示されている
    Capybara.within(".GateModal") do
      find(".new_user_name input").set(:alice)  # ハンドルネームを入力する
      find(".gate_enter_handle").click          # 入室ボタンをクリックする
      find(".close_handle").click               # 閉じる
    end
    assert_room_created
  end

  # 【注意】
  # このチェック対象は地上にあるため os_modal_open_handle などを呼んでモーダルが出ていると読み取れない
  # つまり visit_room で autoexec_room_create_after=os_modal_open_handle などとすると絶対にエラーになってしまう
  def assert_room_created
    assert_var("ac_room", "true", wait: 2)
  end

  def gate_modal_open_handle
    find(".gate_modal_open_handle").click
  end

  # 退室
  def gate_leave_handle
    global_menu_open
    gate_modal_open_handle        # 「入退室」を自分でクリックする
    first(".gate_leave_handle").click   # 退室ボタンをクリックする
    first(".close_handle").click   # 閉じる
  end

  # alice と bob が同じ部屋で2手目まで進めた状態
  def setup_alice_bob_turn2
    window_a do
      room_setup_by_user(:alice, :room_restore_key => "skip")    # alice先輩が部屋を作る
    end
    window_b do
      room_setup_by_user(:bob, :room_restore_key => "skip")      # bob後輩が同じ入退室
    end
    window_a do
      piece_move_o("77", "76", "☗7六歩")  # aliceが指す
    end
    window_b do
      piece_move_o("33", "34", "☖3四歩")  # bobが指す
    end
    window_a do
      assert_turn(2)
    end
    window_b do
      assert_turn(2)
    end
  end
end
