from app.main.data_model.games.pv_game.pv_decision import PVDecision
from app.main.data_model.games.pv_game.pv_center_decision import PVCenterDecision
from app.main.data_model.games.pv_game.pv_center_decision_details import PVCenterDecisionDetails
from app.main.data_model.games.pv_game.pv_center_day import PVCenterDay
from app.main.data_model.games.pv_game.pv_center import PVCenter
from app.main.data_model.games.pv_game.pv_center_story_steps import PVCenterStorySteps
from sqlalchemy import func


class PVDecisionRepository:

    def __init__(self, session):
        self.session = session

    def get_decision_scores(self, decision_ids):
        decision_scores = self.session.query(PVDecision.day_id, func.sum(PVDecision.score1),
                                             func.sum(PVDecision.score2),
                                             func.sum(PVDecision.score3)).filter(PVDecision.id.in_(decision_ids))\
                                .group_by(PVDecision.day_id).all()
        if len(decision_scores) == 0:
            return None
        return decision_scores

    def get_aggregated_decision_scores(self, decision_ids, center_id):
        decision_scores = self.session.query(func.sum(PVDecision.score1),
                                             func.sum(PVDecision.score2),
                                             func.sum(PVDecision.score3)).join(PVCenterDecision)\
                            .filter(PVDecision.id.in_(decision_ids)) \
                            .filter(PVCenterDecision.center_id == center_id) \
                            .filter(PVCenterDecision.decision_id == PVDecision.id).all()
        if decision_scores is None or len(decision_scores) == 0 or decision_scores[0][0] is None:
            return [(0, 0, 0)]
        return decision_scores

    def get_score(self, center_id):
        scores = self.session.query(func.sum(PVDecision.score1), func.sum(PVDecision.score2),
                                func.sum(PVDecision.score3)).join(PVCenterDecision)\
                                .filter(PVDecision.id == PVCenterDecision.decision_id)\
                                .filter(PVCenterDecision.center_id == center_id).all()
        if len(scores) == 0:
            return None
        return scores

    def get_scores(self, game_session_id):
        scores = self.session.query(PVCenter.id, func.sum(PVDecision.score1), func.sum(PVDecision.score2),
                                    func.sum(PVDecision.score3))\
                            .select_from(PVCenter)\
                            .join(PVCenterDecision).join(PVDecision)\
                            .filter(PVDecision.id == PVCenterDecision.decision_id,
                                    PVCenter.id == PVCenterDecision.center_id,
                                    PVCenter.game_session_id == game_session_id
                                    )\
                            .group_by(PVCenter.id)\
                            .all()
        if len(scores) == 0:
            return None
        return scores

    def get_pv_center_day(self, center_id, day_id):
        center_day = self.session.query(PVCenterDay).filter(PVCenterDay.center_id == center_id).\
            filter(PVCenterDay.day_id == day_id).all()
        if len(center_day) == 0:
            return None
        return center_day[0]

    def get_pv_center_days(self, center_id):
        center_days = self.session.query(PVCenterDay).filter(PVCenterDay.center_id == center_id).all()
        if len(center_days) == 0:
            return None
        return center_days

    def get_pv_center_decisions(self, center_id):
        decisions = self.session.query(PVCenterDecision).filter(PVCenterDecision.center_id == center_id).all()
        if len(decisions) == 0:
            return None
        return decisions

    def get_pv_center_decision_details(self, center_id, day_id):
        decision_details = self.session.query(PVCenterDecisionDetails).\
            filter(PVCenterDecisionDetails.center_id == center_id).\
            filter(PVCenterDecisionDetails.day_id == day_id).all()
        if len(decision_details) == 0:
            return []
        return decision_details

    def get_pv_center_decisions_by_center_id_and_day_id(self, center_id, day_id):
        old_decisions = self.session.query(PVCenterDecision).filter(PVCenterDecision.center_id == center_id).\
            filter(PVCenterDecision.day_id == day_id).all()
        if len(old_decisions) == 0:
            return None
        return old_decisions

    def get_pv_center_old_decision_details(self, center_id, day_id):
        old_decisions_details = self.session.query(PVCenterDecisionDetails).\
            filter(PVCenterDecisionDetails.center_id == center_id).\
            filter(PVCenterDecisionDetails.day_id == day_id).\
            all()
        if len(old_decisions_details) == 0:
            return None
        return old_decisions_details[0]

    def get_center_badge_decisions(self, decision_ids, center_id):
        center_decision_ids = self.session.query(PVDecision.id).join(PVCenterDecision).\
            filter(PVCenterDecision.center_id == center_id).filter(PVCenterDecision.decision_id == PVDecision.id).\
            filter(PVDecision.id.in_(decision_ids)).all()
        return center_decision_ids

    def get_center_story_steps(self, center_id):
        center_story_steps = self.session.query(PVCenterStorySteps).filter(PVCenterStorySteps.center_id == center_id).all()
        if len(center_story_steps) == 0:
            return []
        return center_story_steps



