import os
import json
import numpy as np
import argparse


class_tag_1 = {1: '磨玻璃结节',
               2: '实性结节',
               3: '混合结节',
               4: '钙化结节'}

class_tag_2 = {1: '良性',
               2: '恶性'}


def followup_processing(args):
    # 按病人id和时间整理匹配结果
    followup_root = os.path.join(args.job_data_root, 'output/elastix')
    files = os.listdir(followup_root)

    working_dicts = {}
    for name in files:
        patientid = name.split('_')[0].split('-')[-1]
        if patientid not in working_dicts.keys():
            working_dicts[patientid] = []
            working_dicts[patientid].append(os.path.join(followup_root, name))
        else:
            working_dicts[patientid].append(os.path.join(followup_root, name))
    
    for key in list(working_dicts.keys()):
        working_dicts[key] = sorted(working_dicts[key])

    # 计算每一个病人的信息，（size、类别）
    working_infos = {}
    for key in list(working_dicts.keys()):
        working_infos[key] = []
        files = working_dicts[key]
        for file in files:
            temp= {'matched': [],
                   'missing': [],
                   'new': []}
            match_results = json.load(open(os.path.join(file, 'match_results.json'), 'r'))
            if len(match_results['matched']) != 0:
                for res in match_results['matched']:
                    res[0].append(res[0][3] * res[0][4] * res[0][5])
                    res[1].append(res[1][3] * res[1][4] * res[1][5])
                    temp['matched'].append(res)
        
            if len(match_results['missing']) != 0:
                for res in match_results['missing']:
                    res.append(res[3] * res[4] * res[5])
                    temp['missing'].append(res)

            if len(match_results['new']) != 0:
                for res in match_results['new']:
                    res.append(res[3] * res[4] * res[5])
                    temp['new'].append(res)
        
            working_infos[key].append(temp)
        
        

    # 得出结论
    class_change = {'1': [], '2': []}
    for key in list(working_infos.keys()):
        print('For Patient-{}'.format(key))
        print('\n')
        temp = {'big': {'num': 0, 
                        'll': []}, 
                'small': {'num': 0,
                          'll': []},
                'eq': {'num': 0,
                        'll': []}
            }
        for value in working_infos[key]:
            if len(value['matched']) != 0:
                for pp in value['matched']:
                    if pp[0][-1] > pp[1][-1]:
                        temp['small']['num'] += 1
                        temp['small']['ll'].append(abs(pp[0][-1] - pp[1][-1]))
                    elif pp[0][-1] < pp[1][-1]:
                        temp['big']['num'] += 1
                        temp['big']['ll'].append(abs(pp[0][-1] - pp[1][-1]))
                    elif pp[0][-1] == pp[1][-1]:
                        temp['eq']['num'] += 1
                        temp['eq']['ll'].append(pp[0][-1])
                    class_change['1'].append(pp[0][-3])
                    class_change['1'].append(pp[0][-3])
                    class_change['2'].append(pp[0][-2])
                    class_change['2'].append(pp[0][-2])
        
        choice_tag = None
        choice_num = -100
        choice_ll = []
        for tag in list(temp.keys()):
            if choice_num < temp[tag]['num']:
                choice_tag = tag
                choice_num = temp[tag]['num']
                choice_ll = temp[tag]['ll']
        
        if choice_tag == 'big':
            print('结节可能向变大发展，约变大{};'.format(np.random.choice(choice_ll, size=1)[0]))
            print('结节分类结果可能为：{};'.format(class_tag_1[np.random.choice(class_change['1'], size=1)[0]]))
            print('结节良恶性分类结果可能为： {}.'.format(class_tag_2[np.random.choice(class_change['2'], size=1)[0]]))
        elif choice_tag == 'small':
            print('结节可能向变小发展，约变小{};'.format(np.random.choice(choice_ll, size=1)[0]))
            print('结节分类结果可能为：{};'.format(class_tag_1[np.random.choice(class_change['1'], size=1)[0]]))
            print('结节良恶性分类结果可能为： {}.'.format(class_tag_2[np.random.choice(class_change['2'], size=1)[0]]))
        elif choice_tag == 'eq':
            print('结节可能向不变发展，约保持{};'.format(np.random.choice(choice_ll, size=1)[0]))
            print('结节分类结果可能为：{};'.format(class_tag_1[np.random.choice(class_change['1'], size=1)[0]]))
            print('结节良恶性分类结果可能为： {}.'.format(class_tag_2[np.random.choice(class_change['2'], size=1)[0]]))


if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='followup processing')
    parser.add_argument('--job_data_root', default='/data/job_715/job_data_preprocess', type=str, help='model')
    args = parser.parse_args()

    followup_processing(args)
