from app.main.data_model.games.leadedge.le_company_result import LECompanyResult
from app.main.data_model.games.leadedge.le_round import LERound
from app.main.data_model.games.leadedge.le_round_scenario import LERoundScenario


class LECompanyResultRepository:

    def __init__(self, session):
        self.session = session

    def find_company_result_by_round_id_and_company_id(self, round_id, company_id):
        return self.session.query(LECompanyResult).join(LERoundScenario).filter(
            LECompanyResult.round_scenario_id == LERoundScenario.id,
            LERoundScenario.le_round_id == round_id,
            LERoundScenario.is_equilibrium == 1,
            LECompanyResult.company_id == company_id
        ).first()

    def find_company_results_by_company_id(self, company_id, round_id):
        return self.session.query(LECompanyResult).join(LERoundScenario).filter(
            LECompanyResult.round_scenario_id == LERoundScenario.id,
            LERoundScenario.is_equilibrium == 1,
            LECompanyResult.company_id == company_id,
            LERoundScenario.le_round_id <= round_id
        ).all()

    def find_company_results_by_round_id(self, game_session_id, round_id):
        return self.session.query(LECompanyResult).join(LERoundScenario).join(LERound).filter(
            LECompanyResult.round_scenario_id == LERoundScenario.id,
            LERoundScenario.is_equilibrium == 1,
            LERoundScenario.le_round_id == round_id,
            LERoundScenario.le_round_id == LERound.id,
            LERound.game_session_id == game_session_id
        ).all()

    def get_last_company_result(self, company_id, game_session_id, round_id):
        return self.session.query(LECompanyResult).join(LERoundScenario).join(LERound).filter(
            LECompanyResult.company_id == company_id,
            LECompanyResult.round_scenario_id == LERoundScenario.id,
            LERoundScenario.is_equilibrium == 1,
            LERound.game_session_id == game_session_id,
            LERoundScenario.le_round_id == LERound.id,
            LERound.id < round_id
        ).order_by(LERound.id.desc()).first()
