from os import getcwd
from os import path

from eventlet import tpool

from pycs.ApplicationStatus import ApplicationStatus
from pycs.pipeline.Job import Job
from pycs.pipeline.tf1.pipeline import Pipeline as TF1Pipeline
from pycs.projects.Project import Project


class PipelineManager:
    def __init__(self, project: Project):
        self.project = project
        self.pipeline = tpool.execute(self.__load_pipeline, project['pipeline']['model-distribution'])

    def __enter__(self):
        return self

    def __exit__(self, type, value, traceback):
        self.pipeline.close()

    def run(self, media_file):
        print('>>>', media_file)

        # create job list
        # TODO update job progress
        job = Job('detect-faces', self.project['id'], media_file)
        result = tpool.execute(lambda p, j: p.execute(j), self.pipeline, job)
        media_file['predictionResults'] = result.predictions

        print('<<<', media_file)

    def __load_pipeline(self, pipeline_identifier):
        model_distribution = self.project.parent.parent['models'][pipeline_identifier]

        if model_distribution['mode'] == 'tf1':
            model_root = path.join(getcwd(), 'models', model_distribution['name'])

            pipeline = TF1Pipeline()
            pipeline.load(model_root, model_distribution['pipeline'])

            return pipeline

    '''
    def __update(self, data):
        # get current project path
        opened_projects = list(filter(lambda x: x['status'] == 'open', data))
        if len(opened_projects) == 0:
            return

        current_project = opened_projects[0]

        # find images to predict
        if 'data' not in current_project.keys() or len(current_project['data']) == 0:
            return

        # load pipeline
        pipeline = tpool.execute(self.__load_pipeline, current_project['pipeline']['model-distribution'])

        # create job list
        for d in current_project['data']:
            print('keys:', d.keys())
            if 'result' not in d.keys():
                # TODO update job progress
                job = Job('detect-faces', current_project['id'], d)
                result = tpool.execute(lambda p, j: p.execute(j), pipeline, job)
                d['result'] = result.predictions

        # close pipeline
        pipeline.close()
    '''

    '''
    def __update(self, data):
        for current_project in data:
            print('>>>>>>>>>>')
            # find images to predict
            if 'data' not in current_project.keys() or len(current_project['data']) == 0:
                return

            # load pipeline
            pipeline = tpool.execute(self.__load_pipeline, current_project['pipeline']['model-distribution'])

            # create job list
            for d in current_project['data']:
                print('keys:', d.keys())
                if 'result' not in d.keys():
                    # TODO update job progress
                    job = Job('detect-faces', current_project['id'], d)
                    result = tpool.execute(lambda p, j: p.execute(j), pipeline, job)
                    d['result'] = result.predictions

            # close pipeline
            pipeline.close()
    '''