from app.main.data_model.games.leadedge.le_company_scenario import LECompanyScenario
from app.main.data_model.games.leadedge.le_round import LERound
from app.main.data_model.games.leadedge.le_round_scenario import LERoundScenario


class LECompanyScenarioRepository:

    def __init__(self, session):
        self.session = session

    def find_company_scenario_by_round_id_and_company_id(self, round_id, company_id):
        return self.session.query(LECompanyScenario).join(LERoundScenario).filter(
            LECompanyScenario.round_scenario_id == LERoundScenario.id,
            LERoundScenario.le_round_id == round_id,
            LERoundScenario.is_equilibrium == 1,
            LECompanyScenario.company_id == company_id
        ).first()

    def find_company_scenarios_by_company_id(self, company_id, round_id):
        return self.session.query(LECompanyScenario).join(LERoundScenario).filter(
            LECompanyScenario.round_scenario_id == LERoundScenario.id,
            LERoundScenario.is_equilibrium == 1,
            LECompanyScenario.company_id == company_id,
            LERoundScenario.le_round_id <= round_id
        ).all()

    def find_company_scenarios_by_round_id(self, game_session_id, round_id):
        return self.session.query(LECompanyScenario).join(LERoundScenario).join(LERound).filter(
            LECompanyScenario.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_equilibrium_scenario(self, company_id, game_session_id, round_id):
        return self.session.query(LECompanyScenario).join(LERoundScenario).join(LERound).filter(
            LECompanyScenario.company_id == company_id,
            LECompanyScenario.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()
