from app.main.data_model.games.eccbc_onboarding.eccbc_onboarding_decision import ECCBCOnboardingDecision
from app.main.data_model.games.eccbc_onboarding.eccbc_onboarding_mission_decision import ECCBCOnboardingMissionDecision
from app.main.data_model.games.eccbc_onboarding.eccbc_onboarding_mission_decision_details import ECCBCOnboardingMissionDecisionDetails
from app.main.data_model.games.eccbc_onboarding.eccbc_onboarding_mission_day import ECCBCOnboardingMissionDay
from app.main.data_model.games.eccbc_onboarding.eccbc_onboarding_mission import ECCBCOnboardingMission
from app.main.data_model.games.eccbc_onboarding.eccbc_onboarding_mission_story_steps import ECCBCOnboardingMissionStorySteps
from sqlalchemy import func


class ECCBCOnboardingDecisionRepository:

    def __init__(self, session):
        self.session = session

    def get_decision_scores(self, decision_ids):
        decision_scores = self.session.query(ECCBCOnboardingDecision.day_id, func.sum(ECCBCOnboardingDecision.score1),
                                             func.sum(ECCBCOnboardingDecision.score2)).filter(ECCBCOnboardingDecision.id.in_(decision_ids))\
                                .group_by(ECCBCOnboardingDecision.day_id).all()
        if len(decision_scores) == 0:
            return None
        return decision_scores

    def get_aggregated_decision_scores(self, decision_ids, mission_id):
        decision_scores = self.session.query(func.sum(ECCBCOnboardingDecision.score1),
                                             func.sum(ECCBCOnboardingDecision.score2)
                                             ).join(ECCBCOnboardingMissionDecision)\
                            .filter(ECCBCOnboardingDecision.id.in_(decision_ids),
                            ECCBCOnboardingMissionDecision.mission_id == mission_id,
                            ECCBCOnboardingMissionDecision.decision_id == ECCBCOnboardingDecision.id).all()
        if decision_scores is None or len(decision_scores) == 0 or decision_scores[0][0] is None:
            return [(0, 0)]
        return decision_scores

    def get_score(self, mission_id):
        scores = self.session.query(func.sum(ECCBCOnboardingDecision.score1), func.sum(ECCBCOnboardingDecision.score2))\
            .join(ECCBCOnboardingMissionDecision).filter(
                ECCBCOnboardingDecision.id == ECCBCOnboardingMissionDecision.decision_id,
            ECCBCOnboardingMissionDecision.mission_id == mission_id).all()
        if len(scores) == 0:
            return None
        return scores

    def get_scores(self, game_session_id):
        scores = self.session.query(ECCBCOnboardingMission.id, func.sum(ECCBCOnboardingDecision.score1), func.sum(ECCBCOnboardingDecision.score2))\
                            .select_from(ECCBCOnboardingMission)\
                            .join(ECCBCOnboardingMissionDecision).join(ECCBCOnboardingDecision)\
                            .filter(ECCBCOnboardingDecision.id == ECCBCOnboardingMissionDecision.decision_id,
                                    ECCBCOnboardingMission.id == ECCBCOnboardingMissionDecision.mission_id,
                                    ECCBCOnboardingMission.game_session_id == game_session_id
                                    )\
                            .group_by(ECCBCOnboardingMission.id).all()

        if len(scores) == 0:
            return None
        return scores

    def get_scores_by_mission_id(self, mission_id):
        scores = self.session.query(ECCBCOnboardingMission.id, func.sum(ECCBCOnboardingDecision.score1), func.sum(ECCBCOnboardingDecision.score2)) \
            .select_from(ECCBCOnboardingMission) \
            .join(ECCBCOnboardingMissionDecision).join(ECCBCOnboardingDecision) \
            .filter(ECCBCOnboardingDecision.id == ECCBCOnboardingMissionDecision.decision_id,
                    ECCBCOnboardingMission.id == ECCBCOnboardingMissionDecision.mission_id,
                    ECCBCOnboardingMission.id == mission_id
                    ) \
            .group_by(ECCBCOnboardingMission.id).all()

        if len(scores) == 0:
            return None
        return scores

    def get_eccbc_onboarding_mission_day(self, mission_id, day_id):
        mission_day = self.session.query(ECCBCOnboardingMissionDay).filter(
            ECCBCOnboardingMissionDay.mission_id == mission_id,
            ECCBCOnboardingMissionDay.day_id == day_id
        ).first()
        return mission_day

    def get_eccbc_onboarding_mission_days(self, mission_id):
        mission_days = self.session.query(ECCBCOnboardingMissionDay).filter(ECCBCOnboardingMissionDay.mission_id == mission_id).all()
        if len(mission_days) == 0:
            return None
        return mission_days

    def get_eccbc_onboarding_mission_decisions(self, mission_id):
        decisions = self.session.query(ECCBCOnboardingMissionDecision).filter(ECCBCOnboardingMissionDecision.mission_id == mission_id).all()
        if len(decisions) == 0:
            return None
        return decisions

    def get_eccbc_onboarding_mission_decision_details(self, mission_id, day_id):
        decision_details = self.session.query(ECCBCOnboardingMissionDecisionDetails).\
            filter(
            ECCBCOnboardingMissionDecisionDetails.mission_id == mission_id,
                ECCBCOnboardingMissionDecisionDetails.day_id == day_id).all()
        if len(decision_details) == 0:
            return []
        return decision_details

    def get_eccbc_onboarding_mission_decisions_by_mission_id_and_day_id(self, mission_id, day_id):
        old_decisions = self.session.query(ECCBCOnboardingMissionDecision).filter(
            ECCBCOnboardingMissionDecision.mission_id == mission_id,
            ECCBCOnboardingMissionDecision.day_id == day_id
        ).all()
        if len(old_decisions) == 0:
            return None
        return old_decisions

    def delete_eccbc_onboarding_mission_decisions(self, decision_ids):
        self.session.query(ECCBCOnboardingMissionDecision).filter(
            ECCBCOnboardingMissionDecision.id.in_(decision_ids)
        ).delete()
        self.session.flush()

    def get_eccbc_onboarding_mission_old_decision_details(self, mission_id, day_id):
        old_decisions_details = self.session.query(ECCBCOnboardingMissionDecisionDetails).filter(
            ECCBCOnboardingMissionDecisionDetails.mission_id == mission_id,
            ECCBCOnboardingMissionDecisionDetails.day_id == day_id
        ).all()
        if len(old_decisions_details) == 0:
            return None
        return old_decisions_details[0]

    def get_mission_badge_decisions(self, decision_ids, mission_id):
        mission_decision_ids = self.session.query(ECCBCOnboardingDecision.id).join(ECCBCOnboardingMissionDecision).filter(
            ECCBCOnboardingMissionDecision.mission_id == mission_id,
            ECCBCOnboardingMissionDecision.decision_id == ECCBCOnboardingDecision.id,
            ECCBCOnboardingDecision.id.in_(decision_ids)
        ).all()
        return mission_decision_ids

    def get_mission_story_steps(self, mission_id):
        mission_story_steps = self.session.query(ECCBCOnboardingMissionStorySteps).filter(
            ECCBCOnboardingMissionStorySteps.mission_id == mission_id
        ).all()
        if len(mission_story_steps) == 0:
            return []
        return mission_story_steps



