require 'rails_helper'

RSpec.describe 'Gekanator games API', type: :request do
  let!(:admin) { create_admin_user! }
  let!(:user) { create_member_user! }
  let!(:guessed_post) { Post.create!(title: 'guess', url: 'https://example.com/guess') }
  let!(:correct_post) { Post.create!(title: 'correct', url: 'https://example.com/correct') }

  describe 'POST /gekanator/games' do
    it 'stores a won game' do
      sign_in_as admin

      post '/gekanator/games', params: {
          guessed_post_id: guessed_post.id,
          correct_post_id: guessed_post.id,
          answers: [{ question_id: 'tag:1', answer: 'yes' }] }

      expect(response).to have_http_status(:created)
      game = GekanatorGame.find(json['id'])
      expect(game.user).to eq(admin)
      expect(game.guessed_post).to eq(guessed_post)
      expect(game.correct_post).to eq(guessed_post)
      expect(game.won).to eq(true)
      expect(game.question_count).to eq(1)
      expect(game.answers).to eq([{ 'question_id' => 'tag:1', 'answer' => 'yes' }])
    end

    it 'stores a lost game with the correct post' do
      sign_in_as admin

      post '/gekanator/games', params: {
          guessed_post_id: guessed_post.id,
          correct_post_id: correct_post.id,
          question_count: 4,
          answers: [{ question_id: 'tag:1', answer: 'no' }] }

      expect(response).to have_http_status(:created)
      game = GekanatorGame.find(json['id'])
      expect(game.correct_post).to eq(correct_post)
      expect(game.won).to eq(false)
      expect(game.question_count).to eq(1)
    end

    it 'rejects a game without the correct post' do
      sign_in_as admin

      post '/gekanator/games', params: {
          guessed_post_id: guessed_post.id,
          question_count: 4,
          answers: [{ question_id: 'tag:1', answer: 'no' }] }

      expect(response).to have_http_status(:unprocessable_entity)
    end

    it 'returns unauthorized without a user' do
      post '/gekanator/games', params: {
          guessed_post_id: guessed_post.id,
          correct_post_id: guessed_post.id,
          answers: [] }

      expect(response).to have_http_status(:unauthorized)
    end

    it 'stores a game for a non-admin user' do
      sign_in_as user

      post '/gekanator/games', params: {
          guessed_post_id: guessed_post.id,
          correct_post_id: guessed_post.id,
          answers: [{ question_id: 'tag:1', answer: 'yes' }] }

      expect(response).to have_http_status(:created)
      expect(GekanatorGame.find(json['id']).user).to eq(user)
    end
  end
end
