class TournamentInProgress(AppSimulatingTest):

    def setUp(self):
        super(TournamentInProgress, self).setUp()

        self.name = 'test_in_progress'
        self.player_1 = 'p1'

        self.injector.inject(self.name, num_players=0)
        self.injector.add_player(self.name, self.player_1)
        self.tournament = Tournament(self.name)
        self.tournament.update({
            'rounds': 1,
            'missions': ['mission01'],
            'score_categories': [score_cat_args('cat', 100, True, 1, 1, False)]
        })

    def test_default_state(self):
        self.assertFalse(self.tournament.get_dao().in_progress)

    def test_no_categories(self):
        self.tournament.update({'score_categories': []})
        self.assertRaises(ValueError, self.tournament.set_in_progress)

    def test_no_entries(self):
        self.tournament.update({'rounds': 0})
        dao = self.tournament.get_dao()
        Reg.query.filter_by(tournament_id=dao.id).delete()
        TournamentEntry.query.filter_by(tournament_id=dao.name).delete()
        self.assertRaises(ValueError, self.tournament.set_in_progress)

    def test_no_missions(self):
        self.tournament.update({'rounds': 0})
        self.tournament.update({'rounds': 1})
        self.assertRaises(ValueError, self.tournament.set_in_progress)

    def test_no_rounds(self):
        self.tournament.update({'rounds': 0})
        self.assertRaises(ValueError, self.tournament.set_in_progress)

    def test_set_in_progress(self):
        self.tournament.set_in_progress()
        self.assertTrue(self.tournament.get_dao().in_progress)

    def test_non_finalised_only_actions(self):
        self.tournament.set_in_progress()

        args = score_cat_args('disallowed_cat', 100, True, 1, 1)
        self.assertRaises(ValueError, self.tournament.update,
                          {'score_categories': [args]})
        self.assertRaises(ValueError, self.tournament.update, {'rounds': 5})

        rego = Reg(self.player_1, self.name)
        rego.add_to_db()
        self.assertRaises(ValueError, self.tournament.confirm_entries)
    def test_enter_score(self):
        """
        Enter a score for an entry
        """
        entry = TournamentEntry.query.filter_by(
            player_id=self.player, tournament_id=self.tourn_1).first()
        tourn = Tournament(self.tourn_1)

        # a one-off score
        Score(category=self.cat_1.name, tournament=tourn, entry_id=entry.id,
              score=0).write()
        scores = TournamentScore.query.\
            filter_by(entry_id=entry.id, tournament_id=tourn.get_dao().id).all()
        compare(len(scores), 1)
        compare(scores[0].score.value, 0)

        # a per_round score
        tourn.make_draws()

        round_id = TournamentRound.query.\
            filter_by(tournament_name=self.tourn_1, ordering=2).first().id
        game_id = TournamentGame.query.join(GameEntrant).\
            filter(and_(GameEntrant.entrant_id == entry.id,
                        TournamentGame.tournament_round_id == round_id)).\
                first().id
        Score(category=self.category_2.name, tournament=tourn, game_id=game_id,
              entry_id=entry.id, score=17).write()
        scores = GameScore.query.\
            filter_by(entry_id=entry.id, game_id=game_id).all()
        compare(len(scores), 1)
        compare(scores[0].score.value, 17)

        # score already entered
        score = Score(tournament=tourn, entry_id=entry.id, score=100,
                      category=self.cat_1.name)
        self.assertRaises(ValueError, score.write)

        score = Score(tournament=tourn, entry_id=entry.id, score=100,
                      category=self.category_2.name, game_id=game_id)
        self.assertRaises(ValueError, score.write)