class PointsController():

    results_controller = None

    def __init__(self):
        self.results_controller = ResultsController()

    def team_points_for_team(self, team, round):
        result = self.results_controller.result_for_team(team, round)
        debate = result.debate

        if debate.OG == team:
            return result.og
        if debate.OO == team:
            return result.oo
        if debate.CG == team:
            return result.cg
        if debate.CO == team:
            return result.co

    def total_points_for_team(self, team, maxround):
        total = 0
        for round in range(1, maxround+1):
            total += self.team_points_for_team(team, round)
        return total

    def speaker_points_for_team(self, team, round):
        result = self.results_controller.result_for_team(team, round)
        debate = result.debate

        if debate.OG == team:
            return [result.ogsp1, result.ogsp2]
        if debate.OO == team:
            return [result.oosp1, result.oosp2]
        if debate.CG == team:
            return [result.cgsp1, result.cgsp2]
        if debate.CO == team:
            return [result.cosp1, result.cosp2]

    def team_points_map_for_round(self, round, teams):
        points = {}
        for team in teams:
            points.update({team: self.team_points_for_team(team, round)})
        return points
class ResultControllerTestCase(TestCase):

    def setUp(self):
        self.resultController = ResultsController()

        self.result = Result()
        self.debate = MagicMock()
        self.debateController = MagicMock()
        self.team = MagicMock

        self.debateController.debate_for_round.return_value = self.debate
        self.debate.result.return_value = self.result

        self.resultController.debate_controller = self.debateController

    def testRaisesExceptionForRoundNotDrawn(self):
        tournament = Tournament.instance()
        tournament.round = 1
        tournament.save()
        with self.assertRaises(TournamentStateException):
            self.resultController.results_entered_for_round(10)

    def testReturnsFalseForRoundWithoutAnyResults(self):
        generate_objects.setup_IV_R1()
        self.assertFalse(self.resultController.results_entered_for_round(1), "No results entered but returned true")

    def testReturnsTrueForRoundWithAllResults(self):
        generate_objects.setup_IV_R1()

        for debate in Debate.objects.filter(round=1):
            generate_objects.valid_result_given_debate(debate)

        self.assertTrue(self.resultController.results_entered_for_round(1), "All results entered but returned false")

    def testReturnsFalseForPartiallyEnteredRound(self):
        generate_objects.setup_IV_R1()
        generate_objects.valid_result_given_debate(Debate.objects.first())

        self.assertFalse(self.resultController.results_entered_for_round(1), "Only some results entered but returned true")

    def testGetResultForRound(self):
        return_value = self.resultController.result_for_team(self.team, 1)
        self.assertEqual(self.debate.result, return_value)