import os
from PIL import Image, ImageFont, ImageDraw
import pandas as pd
import datetime
import directory
import PLOT as PLOT

Font_medium32 = ImageFont.truetype(os.path.join(directory.FONT_DIR, 'Pretendard-Medium.ttf'), 32)
Font_medium45 = ImageFont.truetype(os.path.join(directory.FONT_DIR, 'Pretendard-Medium.ttf'), 45)
Font_medium50 = ImageFont.truetype(os.path.join(directory.FONT_DIR, 'Pretendard-Medium.ttf'), 50)
Font_bold50 = ImageFont.truetype(os.path.join(directory.FONT_DIR, 'Pretendard-Bold.ttf'), 50)
Font_bold55 = ImageFont.truetype(os.path.join(directory.FONT_DIR, 'Pretendard-Bold.ttf'), 55)
Font_bold35 = ImageFont.truetype(os.path.join(directory.FONT_DIR,'Pretendard-Bold.ttf'), 35)
Font_semibold48 = ImageFont.truetype(os.path.join(directory.FONT_DIR,'Pretendard-SemiBold.ttf'), 48)
Font_semibold42 = ImageFont.truetype(os.path.join(directory.FONT_DIR,'Pretendard-SemiBold.ttf'), 42)


BASE_DIR = directory.BASE_DIR
BASE_DIR_EN = directory.BASE_DIR_EN
def make_classifier(file, RESULT_DIR,  number='0000', name='Bwave', sex='M/F', age='00', date=datetime.datetime.today().isoformat().split('T')[0],
              eeg_only=False, ppg_only=False, reportLanguage="kr", predict_result = {}):
    #people = [date, number, name, sex, age+"세"]
    people = [date, number, name, sex, directory.age_modify(age)+"대"] #익명
    reportLanguage = reportLanguage
    if reportLanguage=="en":
        print("en report")
        people = [date, number, name, sex, age]

    if (eeg_only == False) & (ppg_only == False): #TODO: 코드정리
        result_eeg = pd.read_csv(os.path.join(RESULT_DIR, file.split('/')[-1][:-4] + '_eeg.csv'))
        result_ppg = pd.read_csv(os.path.join(RESULT_DIR, file.split('/')[-1][:-4] + '_ppg.csv'))
        eeg_ebsi = str(result_eeg['eeg_ebsi'].values[0])
        ppg_ebsi = str(result_ppg['ppg_ebsi'].values[0])

        mean_result = {k: v['mean'] for k, v in predict_result.items()}
        PLOT.plot_4class(mean_result,'eeg',RESULT_DIR)
        report_page1(people, RESULT_DIR, reportLanguage=reportLanguage, predict_result = predict_result)


    


def report_page1(people:list, RESULT_DIR:str, reportLanguage="kr", predict_result = {}):
    reportLanguage = reportLanguage

    if reportLanguage=="en":
        BASE_DIR = directory.BASE_DIR_EN
    else:
        BASE_DIR = directory.BASE_DIR

    first_1 = Image.open(os.path.join(BASE_DIR, '4class.png'))






    draw = ImageDraw.Draw(first_1)
    if reportLanguage=="en":
        draw.text((250, 335), people[0], fill="black", font=Font_medium45, align='center')
        draw.text((800, 335), people[1], fill="black", font=Font_medium45, align='center')
        draw.text((1430, 335), people[2], fill="black", font=Font_medium45, align='center')
        draw.text((1930, 335), people[3], fill="black", font=Font_medium45, align='center')
        draw.text((2220, 335), people[4], fill="black", font=Font_medium45, align='center')
    else:
        draw.text((283, 343), people[0], fill="black", font=Font_medium32, align='center')
        draw.text((623, 343), people[1], fill="black", font=Font_medium32, align='center')
        draw.text((928, 343), people[2], fill="black", font=Font_medium32, align='center')
        draw.text((1193, 344), people[3], fill="black", font=Font_medium32, align='center')
        draw.text((1408, 344), '만 ' + people[4], fill="black", font=Font_medium32, align='center')

    add_image_1 = Image.open(os.path.join(RESULT_DIR, 'eeg_HC_score.png'))
    add_image_2 = Image.open(os.path.join(RESULT_DIR, 'eeg_ANX_score.png'))
    add_image_3 = Image.open(os.path.join(RESULT_DIR, 'eeg_PSY_score.png'))
    add_image_4 = Image.open(os.path.join(RESULT_DIR, 'eeg_MDD_score.png'))

    left, top, right, bottom = 200, 200, 1400, 1250

    add_image_1 = add_image_1.crop((left, top, right, bottom))
    add_image_2 = add_image_2.crop((left, top, right, bottom))
    add_image_3 = add_image_3.crop((left, top, right, bottom))
    add_image_4 = add_image_4.crop((left, top, right, bottom))



    add_image_1 = add_image_1.resize((int(1000 / 1.75), int(1000 / 2.0)))
    add_image_2 = add_image_2.resize((int(1000 / 1.75), int(1000 / 2.0)))
    add_image_3 = add_image_3.resize((int(1000 / 1.75), int(1000 / 2.0)))
    add_image_4 = add_image_4.resize((int(1000 / 1.75), int(1000 / 2.0)))

    '''draw1 = ImageDraw.Draw(add_image_1)

    w, h = add_image_1.size #테스트용 테두리 시각화
    draw1.rectangle(
        [(0, 0), (w - 1, h - 1)],
        outline="red",
        width=5
    )'''

    image_map = {
        'HC': add_image_1,
        'ANX': add_image_2,
        'PSY': add_image_3,
        'MDD': add_image_4,
    }

    positions = {
        'HC': (610, 1040),
        'ANX': (1760, 1040),
        'PSY': (610, 1810),
        'MDD': (1760, 1810),
    }

    for label in ['HC', 'ANX', 'PSY', 'MDD']:
        first_1.paste(image_map[label], positions[label], image_map[label])

    for label in ['HC', 'ANX', 'PSY', 'MDD']:
        img = image_map[label]
        x0, y0 = positions[label]
        w, h = img.size

        lo = predict_result[label]['lo']
        hi = predict_result[label]['hi']

        if reportLanguage=="en":
            text = f"Range: {lo:.1f}%~{hi:.1f}%"
        else:
            text = f"확률범위: {lo:.1f}%~{hi:.1f}%"

        draw.text(
            (x0 + w - 480, y0 + h + 35),
            text,
            fill=(90, 90, 90),
            font=Font_medium50,
            anchor="rs"
        )





    COMMENT_MAP = {
        ('MDD', 'ANX'): "우울 가능성이 {p1:.1f}%로 높게 나타났으며, 동시에 불안 가능성도 {p2:.1f}% 수준으로\n"
                 "확인되었습니다. 우울감이 지속되면서 걱정과 긴장이 함께 증가하는 양상을 보입니다.",

        ('MDD', 'PSY'): "우울 가능성이 {p1:.1f}%로 높게 나타났고, 정서 불균형 가능성도 {p2:.1f}% 수준으로\n"
                 "동반되었습니다. 감정 기복이 커지고 정서적 안정성이 흔들릴 수 있습니다.",

        ('MDD', 'HC'): "우울 가능성이 {p1:.1f}%로 확인되었으나, 건강 유지 가능성은 {p2:.1f}%로 비교적\n"
                      "유지되고 있습니다. 우울 신호는 있으나 기본적인 회복력은 보존된 상태입니다.",


        ('ANX', 'MDD'): "불안 가능성이 {p1:.1f}%로 높게 나타났으며, 우울 가능성도 {p2:.1f}% 수준으로 함께\n"
                 "증가한 양상입니다. 지속적인 긴장이 정서적 피로로 이어질 가능성이 있습니다.",

        ('ANX', 'PSY'): "불안 가능성이 {p1:.1f}%로 두드러지며, 정서 불균형 가능성도 {p2:.1f}% 수준으로\n"
                        "확인되었습니다. 감정 반응이 예민해지고 변동성이 커질 수 있습니다.",

        ('ANX', 'HC'): "불안 가능성은 {p1:.1f}%로 나타났으나, 건강 유지 가능성은 {p2:.1f}%로 비교적\n"
                       "안정적인 상태입니다. 불안 신호는 있으나 전반적 기능 저하는 제한적입니다.",


        ('PSY', 'MDD'): "정서 불균형 가능성이 {p1:.1f}%로 높게 나타났으며, 이로 인해 우울 가능성도 {p2:.1f}% \n"
                 "수준으로 이어진 상태입니다. 감정 기복 이후 무기력한 느낌이 동반될 수 있습니다.",

        ('PSY', 'HC'): "정서 불균형 가능성이 {p1:.1f}%로 관찰되었으나, 건강 유지 가능성은 {p2:.1f}%로\n"
                "비교적 양호합니다. 일시적 감정 변동은 있으나 회복 가능성이 높은 상태입니다.",

        ('PSY', 'ANX'): "정서 불균형 가능성이 {p1:.1f}%로 나타나며, 불안 가능성도 {p2:.1f}% 수준으로\n"
                        "동반됩니다. 감정 변화가 긴장과 걱정으로 쉽게 이어질 수 있습니다.",


        ('HC', 'MDD'): "건강 유지 가능성은 {p1:.1f}%로 안정적인 편이나, 우울 가능성이 {p2:.1f}% 수준으로\n"
                 "확인됩니다. 초기 정서 변화 단계로 예방적 관리가 도움이 될 수 있습니다.",

        ('HC', 'ANX'): "건강 유지 가능성은 {p1:.1f}%로 비교적 양호하나, 불안 가능성이 {p2:.1f}%로\n"
                       "나타났습니다.특정 상황에서 긴장과 걱정이 증가할 수 있습니다.",
        ('HC', 'PSY'): "건강 유지 가능성은 {p1:.1f}%로 유지되고 있으나, 정서 불균형 가능성이 {p2:.1f}%\n"
                 "수준으로 관찰됩니다. 스트레스 상황에서 감정 기복이 커질 수 있습니다."

    }

    COMMENT_MAP_en = {

    # MDD → ANX
    ('MDD', 'ANX'):
        "A higher likelihood of depression {p1:.1f}% was observed, along with elevated\n"
        "anxiety levels {p2:.1f}%. Persistent low mood may be accompanied by increased\n"
        "worry and psychological tension.",

    # MDD → PSY
    ('MDD', 'PSY'):
        "A higher likelihood of depression {p1:.1f}% was identified, together with signs\n"
        "of emotional imbalance {p2:.1f}%. Emotional fluctuations and reduced stability\n"
        "may be present.",

    # MDD → HC
    ('MDD', 'HC'):
        "Indicators of depression {p1:.1f}% were noted, while overall health-related\n"
        "stability remains relatively preserved at {p2:.1f}%. Basic emotional resilience\n"
        "appears to be maintained.",


    # ANX → MDD
    ('ANX', 'MDD'):
        "Elevated anxiety levels {p1:.1f}% were observed, with depressive tendencies\n"
        "{p2:.1f}% also appearing concurrently. Prolonged tension may contribute to\n"
        "emotional fatigue over time.",

    # ANX → PSY
    ('ANX', 'PSY'):
        "Anxiety-related indicators {p1:.1f}% appear prominent, alongside signs of\n"
        "emotional imbalance {p2:.1f}%. Emotional responses may become more sensitive\n"
        "and variable.",

    # ANX → HC
    ('ANX', 'HC'):
        "Although anxiety-related signals {p1:.1f}% were present, overall health-related\n"
        "stability remains relatively positive at {p2:.1f}%. Functional impact appears\n"
        "to be limited.",


    # PSY → MDD
    ('PSY', 'MDD'):
        "Signs of emotional imbalance ({p1:.1f}%) were prominent, with increased\n"
        "depressive tendencies ({p2:.1f}%). Emotional fluctuations may be followed by\n"
        "feelings of low energy or withdrawal.",

    # PSY → HC
    ('PSY', 'HC'):
        "Indicators of emotional imbalance {p1:.1f}% were observed, while overall\n"
        "health-related stability remains relatively positive at {p2:.1f}%. Recovery\n"
        "capacity appears to be favorable.",

    # PSY → ANX
    ('PSY', 'ANX'):
        "Emotional imbalance indicators {p1:.1f}% were noted, along with elevated anxiety\n"
        "levels ({p2:.1f}%). Emotional shifts may easily lead to increased tension or worry.",


    # HC → MDD
    ('HC', 'MDD'):
        "Overall health-related stability appears strong at {p1:.1f}%, although indicators\n"
        "of depression {p2:.1f}% were also observed. Early emotional changes may benefit\n"
        "from preventive attention.",

    # HC → ANX
    ('HC', 'ANX'):
        "Overall health-related stability remains relatively high at {p1:.1f}%, while\n"
        "anxiety-related signals ({p2:.1f}%) were noted. Tension may increase in specific\n"
        "situations.",

    # HC → PSY 
    ('HC', 'PSY'):
        "Health-related stability remains positive at {p1:.1f}%, though signs of emotional\n"
        "imbalance {p2:.1f}% were observed. Emotional variability may increase under\n"
        "stressful conditions."
}

    sorted_labels = sorted(
        predict_result.keys(),
        key=lambda x: predict_result[x]['mean'],
        reverse=True
    )

    top1, top2 = sorted_labels[:2]

    p1 = predict_result[top1]['mean']
    p2 = predict_result[top2]['mean']

    # 이모지 매핑
    emoji_map = {
        'HC': '4class_emoji_1.png',
        'ANX': '4class_emoji_2.png',
        'PSY': '4class_emoji_3.png',
        'MDD': '4class_emoji_4.png',
    }

    # 이모지 이미지 로드
    emoji_img = Image.open(os.path.join(BASE_DIR,emoji_map[top1])).convert("RGBA")

    #이모지 붙이기 ( 좌표가 이모지 중앙으로 오도록)
    cx, cy = 365, 2725
    w, h = emoji_img.size

    first_1.paste(
        emoji_img,
        (cx - w // 2, cy - h // 2),
        emoji_img
    )



    if reportLanguage=="en":
        comment_template = COMMENT_MAP_en.get((top1, top2))
        font = Font_semibold42
    else:
        comment_template = COMMENT_MAP.get((top1,top2))
        font = Font_semibold48

    #description 매핑
    comment_text = comment_template.format(p1=p1, p2=p2)

    # description 붙이기
    draw.text((780,2660),
              comment_text,
              fill=(90, 90, 90),
              font=font,
              spacing=12)

    first_1 = first_1.convert('RGB')
    first_1.save(os.path.join(RESULT_DIR, '4class.jpg'))


