from flask import request, jsonify, send_file
from flask_restx import Resource

from app.main.api_declaration import ne_api
from app.main.data_management.data_base import Schema
from app.main.request_handlers.orchestrators.common.user_orchestrator import UserOrchestrator
from app.main.request_handlers.orchestrators.games.hackermind_orchestrator import HackerMindOrchestrator


@ne_api.route('/participant/hackermind/updatemission')
class ParticipantHackerMindUpdateMission(Resource):
    def post(self):
        session = Schema.get_session()
        user_orchestrator = UserOrchestrator(session)
        id = user_orchestrator.validate_user_using_bearer_token(request)
        mission_data = request.get_json()
        orchestrator = HackerMindOrchestrator(session)
        result = orchestrator.update_mission(id, mission_data)
        return jsonify(result)


@ne_api.route('/participant/hackermind/getmission')
class ParticipantHackerMindGetMissionData(Resource):
    def get(self):
        session = Schema.get_session()
        user_orchestrator = UserOrchestrator(session)
        id = user_orchestrator.validate_user_using_bearer_token(request)
        game_session_id = int(request.args.get("game_session_id"))
        orchestrator = HackerMindOrchestrator(session)
        result = orchestrator.get_mission_data(id, game_session_id)
        return jsonify(result)


@ne_api.route('/participant/hackermind/savedecisions')
class ParticipantHackerMindSaveDecisions(Resource):
    def post(self):
        session = Schema.get_session()
        user_orchestrator = UserOrchestrator(session)
        id = user_orchestrator.validate_user_using_bearer_token(request)
        decisions_data = request.get_json()
        orchestrator = HackerMindOrchestrator(session)
        result = orchestrator.save_decisions(id, decisions_data)
        return jsonify(result)


@ne_api.route('/participant/hackermind/savedecisiondetails')
class ParticipantHackerMindSaveDecisionDetails(Resource):
    def post(self):
        session = Schema.get_session()
        user_orchestrator = UserOrchestrator(session)
        id = user_orchestrator.validate_user_using_bearer_token(request)
        decision_details_data = request.get_json()
        orchestrator = HackerMindOrchestrator(session)
        result = orchestrator.save_decision_details(id, decision_details_data)
        return jsonify(result)


@ne_api.route('/participant/hackermind/getdecisiondetails')
class ParticipantHackerMindGetDecisionDetails(Resource):
    def get(self):
        session = Schema.get_session()
        user_orchestrator = UserOrchestrator(session)
        id = user_orchestrator.validate_user_using_bearer_token(request)
        mission_id = int(request.args.get("mission_id"))
        day_id = int(request.args.get("day_id"))
        orchestrator = HackerMindOrchestrator(session)
        result = orchestrator.get_decision_details(id, mission_id, day_id)
        return jsonify(result)


@ne_api.route('/participant/hackermind/getscore')
class ParticipantHackerMindGetScore(Resource):
    def get(self):
        session = Schema.get_session()
        user_orchestrator = UserOrchestrator(session)
        id = user_orchestrator.validate_user_using_bearer_token(request)
        mission_id = int(request.args.get("mission_id"))
        orchestrator = HackerMindOrchestrator(session)
        result = orchestrator.get_score(id, mission_id)
        return jsonify(result)


@ne_api.route('/participant/hackermind/getscores')
class ParticipantHackerMindGetScores(Resource):
    def get(self):
        session = Schema.get_session()
        user_orchestrator = UserOrchestrator(session)
        id = user_orchestrator.validate_user_using_bearer_token(request)
        game_session_id = int(request.args.get("game_session_id"))
        orchestrator = HackerMindOrchestrator(session)
        result = orchestrator.get_scores(id, game_session_id, number=10)
        return jsonify(result)


@ne_api.route('/moderator/hackermind/getscores')
class ModeratorHackerMindGetScores(Resource):
    def get(self):
        session = Schema.get_session()
        user_orchestrator = UserOrchestrator(session)
        id = user_orchestrator.validate_user_using_bearer_token(request)
        game_session_id = int(request.args.get("game_session_id"))
        orchestrator = HackerMindOrchestrator(session)
        result = orchestrator.get_scores(id, game_session_id, number=-1)
        return jsonify(result)


@ne_api.route('/participant/hackermind/closeday')
class ParticipantHackerMindCloseDay(Resource):
    def get(self):
        session = Schema.get_session()
        user_orchestrator = UserOrchestrator(session)
        id = user_orchestrator.validate_user_using_bearer_token(request)
        mission_id = int(request.args.get("mission_id"))
        day_id = int(request.args.get("day_id"))
        orchestrator = HackerMindOrchestrator(session)
        result = orchestrator.close_day(id, mission_id, day_id)
        return jsonify(result)


@ne_api.route('/participant/hackermind/gethistoricscores')
class ParticipantHackerMindGetHistoricScores(Resource):
    def get(self):
        session = Schema.get_session()
        user_orchestrator = UserOrchestrator(session)
        id = user_orchestrator.validate_user_using_bearer_token(request)
        mission_id = int(request.args.get("mission_id"))
        orchestrator = HackerMindOrchestrator(session)
        result = orchestrator.get_historic_scores(id, mission_id)
        return jsonify(result)


@ne_api.route('/participant/hackermind/getbadgesstatus')
class ParticipantHackerMindGetBadgesStatus(Resource):
    def get(self):
        session = Schema.get_session()
        user_orchestrator = UserOrchestrator(session)
        id = user_orchestrator.validate_user_using_bearer_token(request)
        mission_id = int(request.args.get("mission_id"))
        orchestrator = HackerMindOrchestrator(session)
        result = orchestrator.get_badges_status(id, mission_id)
        return jsonify(result)


@ne_api.route('/participant/hackermind/export_certificate')
class ParticipantHackerMindExportCertificate(Resource):
    def get(self):
        session = Schema.get_session()
        user_orchestrator = UserOrchestrator(session)
        id = user_orchestrator.validate_user_using_bearer_token(request)
        mission_id = int(request.args.get("mission_id"))
        orchestrator = HackerMindOrchestrator(session)
        result, file_name = orchestrator.get_certificate(id, mission_id)
        return send_file(result, download_name=file_name, as_attachment=True)


@ne_api.route('/participant/hackermind/finish_mission')
class ParticipantHackerMindFinishMission(Resource):
    def get(self):
        session = Schema.get_session()
        user_orchestrator = UserOrchestrator(session)
        id = user_orchestrator.validate_user_using_bearer_token(request)
        mission_id = int(request.args.get("mission_id"))
        orchestrator = HackerMindOrchestrator(session)
        result = orchestrator.finish_mission(id, mission_id)
        return jsonify(result)
