import json

import connexion

from swagger_server.requets_db.models.vrsta import JobManager
from swagger_server.utils import db_utils
from swagger_server import util
from flask import send_file


def get_conllus(leta=None, vrste=None, kljucne_besede=None, udk=None):  # noqa: E501
    """"Vrne seznam CoNNL-U-jev glede na iskalne pogoje

     # noqa: E501

    :param leta:
    :type leta: List[int]
    :param vrste:
    :type vrste: List[int]
    :param kljucne_besede:
    :type kljucne_besede: List[str]
    :param udk:
    :type udk: List[str]

    :rtype: List[str]
    """
    if not kljucne_besede:
        return "Manjkajo kljucne besede", 400
    files = db_utils.get_files_by_udc(kljucne_besede)
    if not files:
        return 'Nobena datoteka ne ustreza iskalnemu pogoju', 404
    return ' '.join(files), 200


def get_extracted_words(leta=None, vrste=None, kljucne_besede=None, prepovedane_besede=None, udk=None):  # noqa: E501
    """Vrne terminloške kandidate glede na ... (sync)

     # noqa: E501

    :param leta:
    :type leta: List[int]
    :param vrste:
    :type vrste: List[int]
    :param kljucne_besede:
    :type kljucne_besede: List[str]
    :param prepovedane_besede:
    :type prepovedane_besede: List[str]
    :param udk:
    :type udk: List[str]

    :rtype: List[TerminoloskiKandidat]
    """
    terKand = db_utils.vrni_oss_terminoloske_kandidate(leta, vrste, kljucne_besede, prepovedane_besede, udk)
    return terKand, 200


def get_extracted_words_async(leta=None, vrste=None, kljucne_besede=None, prepovedane_besede=None,
                              udk=None):  # noqa: E501
    """Vrne terminloške kandidate glede na ... (async)

     # noqa: E501

    :param leta:
    :type leta: List[int]
    :param vrste:
    :type vrste: List[int]
    :param kljucne_besede:
    :type kljucne_besede: List[str]
    :param prepovedane_besede:
    :type prepovedane_besede: List[str]
    :param udk:
    :type udk: List[str]

    :rtype: str
    """
    job, is_old_job = JobManager.create_job(5, json.dumps(
        {'leta': leta, 'vrste': vrste, 'kljucne_besede': kljucne_besede, 'prepovedane_besede': prepovedane_besede,
         'udk': udk}))
    if job is None:
        return "Something went wrong", 500
    ret = {'check_job_url': f'{connexion.request.url_root}/job/{job.id}'}
    return ret, 200


def get_files(leta=None, vrste=None, kljucne_besede=None, udk=None):  # noqa: E501
    """Vrne seznam binarnih zapisov v originalnem formatu glede na iskalne pogoje

     # noqa: E501

    :param leta: 
    :type leta: List[int]
    :param vrste: 
    :type vrste: List[int]
    :param kljucne_besede:
    :type kljucne_besede: List[str]
    :param udk:
    :type udk: List[str]

    :rtype: str
    """
    if not kljucne_besede:
        return "Manjkajo kljucne besede", 400
    files = db_utils.get_files_by_udc(kljucne_besede)
    if not files:
        return 'Nobena datoteka ne ustreza iskalnemu pogoju', 404
    return ' '.join(files), 200


def get_number_texts(leta=None, vrste=None, kljucne_besede=None, udk=None):  # noqa: E501
    """Vrne število besedil glede na iskalne pogoje

     # noqa: E501

    :param leta: 
    :type leta: List[int]
    :param vrste: 
    :type vrste: List[int]
    :param kljucne_besede:
    :type kljucne_besede: List[str]
    :param udk:
    :type udk: List[str]

    :rtype: int
    """
    # if not kljucnebesede:
    #    return "Manjkajo kljucne besede", 400

    files = db_utils.vrni_oss_dokumente(leta, vrste, kljucne_besede, udk)
    return len(files), 200


def get_texts(leta=None, vrste=None, kljucne_besede=None, udk=None):  # noqa: E501
    """Vrne seznam besedil glede na iskalne pogoje

     # noqa: E501

    :param leta:
    :type leta: List[int]
    :param vrste:
    :type vrste: List[int]
    :param kljucne_besede:
    :type kljucne_besede: List[str]
    :param udk:
    :type udk: List[str]

    :rtype: List[str]
    """
    if not kljucne_besede:
        return "Manjkajo kljucne besede", 400
    files = db_utils.get_files_by_udc(kljucne_besede)
    if not files:
        return 'Nobena datoteka ne ustreza iskalnemu pogoju', 404
    return ' '.join(files), 200


def get_conllu(file_id):  # noqa: E501
    """Vrne CoNNL-U po id-ju datoteke

     # noqa: E501

    :param file_id:
    :type file_id: int

    :rtype: str
    """
    try:
        return send_file(util.get_conllu_file_path_by_id(file_id), download_name=f'{file_id}.conllu')
    except FileNotFoundError as e:
        return "The conllu with this ID doesn't exist.", 404


def get_file(file_id):  # noqa: E501
    """Vrne binarni zapis v originalnem formatu po id-ju datoteke

     # noqa: E501

    :param file_id:
    :type file_id: int

    :rtype: List[bytearray]
    """
    try:
        return send_file(util.get_original_file_path_by_id(file_id), download_name=f'{file_id}.xml')
    except FileNotFoundError as e:
        return "The file with this ID doesn't exist.", 404


def oss_besedilo_po_id_get(file_id):  # noqa: E501
    """Vrne besedilo po id-ju datoteke

     # noqa: E501

    :param file_id:
    :type file_id: int

    :rtype: str
    """
    try:
        f = util.get_original_file_path_by_id(file_id)
        print(f)  # for debugging purposes on the server, delete this later
        return send_file(util.get_original_file_path_by_id(file_id), download_name=f'{file_id}.xml')
    except FileNotFoundError as e:
        return "The file with this ID doesn't exist.", 404
