# -*- coding: utf-8 -*-
"""
MddUse==1 일 때 추가되는 'AI 우울증 진단 검사' 페이지 생성.
기존 4class 페이지(PNG_classifier.py)와 같은 방식으로, 정적 템플릿 이미지 위에
동적 값(측정자 정보, 도넛 2개, 종합 소견 문구의 빈칸 3곳)만 그려 넣어 jpg 한
장을 만든다. 종합 소견의 고정 문구(문장 자체)는 템플릿 이미지에 이미 들어있고,
코드는 그 문장 안의 숫자/단어 빈칸만 덮어쓴다 - 문구를 바꾸고 싶으면 코드가
아니라 템플릿 이미지만 바꾸면 되도록 하기 위함.

템플릿 이미지 경로 (기획팀에서 서버에 업로드):
    국문 : python/base_file_new/mdd_report.png
    영문 : python/base_file_en_new/mdd_report_en.png

"""
import os

from PIL import Image, ImageFont, ImageDraw

import directory
import PLOT as PLOT

Font_medium32 = ImageFont.truetype(os.path.join(directory.FONT_DIR, 'Pretendard-Medium.ttf'), 32)

TEMPLATE_FILENAME_KR = 'mdd_report.png'
TEMPLATE_FILENAME_EN = 'mdd_report_en.png'

# ------------------------------------------------------------------------
# 좌표 상수 (전부 템플릿 실제 크기(W,H)에 대한 비율(0~1) 기준 - 캔버스 해상도가
# 바뀌어도 그대로 쓸 수 있게 절대 픽셀이 아닌 비율로 둔다)
# ------------------------------------------------------------------------

# 상단 측정자 정보 박스: 각 박스 '오른쪽 끝' x비율 (값은 오른쪽 정렬로 그 앞에 찍는다)
HEADER_Y_FRAC_KR = 0.126
HEADER_Y_FRAC_EN = 0.132
HEADER_X_FRAC_KR = {
    'date': 0.220,
    'number': 0.490,
    'name': 0.665,
    'sex': 0.780,
    'age': 0.900,
}
HEADER_X_FRAC_EN = {
    'date': 0.190,
    'number': 0.350,
    'name': 0.485,
    'sex': 0.780,
    'age': 0.880,
}

# 도넛(우울증 확률 / 정상일 확률) 중심 좌표 (x,y 비율) + 리사이즈 크기(px, 정사각 아님)
DONUT_CENTER_FRAC_KR = {
    'dep': (0.315, 0.478),
    'normal': (0.726, 0.478),
}
DONUT_CENTER_FRAC_EN = {
    'dep': (0.315, 0.498),
    'normal': (0.726, 0.498),
}
DONUT_CROP_BOX = (200, 200, 1400, 1250)             # plot_4class(각진 스타일) 정석 크롭 - 4class 페이지와 동일
DONUT_RESIZE = (int(1400 / 1.75), int(1400 / 2.0))

# 종합 소견 문구는 템플릿에 고정 문장으로 이미 들어가 있고, 코드는 그 안의
# 빈칸 3곳(우울증 확률 / 정상일 확률 / 수준 단어)만 덮어쓴다.
# 각 빈칸의 왼쪽 시작점 x,y 비율. ★ 아래 값은 전부 눈대중 추정치이므로,
# 실제 템플릿 png를 그림판 등에서 열어 각 빈칸 좌상단 픽셀 좌표를 재서
# (그 값 / 이미지 전체 W 또는 H) 로 바꿔주면 된다.
COMMENT_BLANK_FRAC_KR = {
    'dep_percent':    (1045 / 2376, 2190 / 3384),   # "우울증 확률은 [ ]%," 의 [ ] 위치 (실측)
    'normal_percent': (1430 / 2376, 2190 / 3384),   # "정상일 확률은 [ ]%로" 의 [ ] 위치 (실측)
    'level':          (1330 / 2376, 2260 / 3384),   # "가능성은 [ ] 수준으로" 의 [ ] 위치 (실측)
}
COMMENT_BLANK_FRAC_EN = {
    'dep_percent':    (1547 / 2376, 2142 / 3384),
    'normal_percent': (1058 / 2376, 2215 / 3384),
    'level':          (1730 / 2376, 2283 / 3384),
}
COMMENT_FONT_SIZE = 40   # 템플릿 본문 폰트 크기와 맞춰서 조정
Font_comment = ImageFont.truetype(os.path.join(directory.FONT_DIR, 'Pretendard-SemiBold.ttf'), COMMENT_FONT_SIZE)

TEXT_COLOR = (55, 65, 81)   # 본문 회색 (기존 리포트 본문 색과 유사한 톤)


def _level_text(dep_percent: float, reportLanguage: str = "kr") -> str:
    """우울 확률을 3단계 정성 평가로 변환 (낮음/보통/높음). 임계값은 필요시 조정."""
    if reportLanguage == "en":
        if dep_percent < 30:
            return "low."
        elif dep_percent < 70:
            return "moderate."
        return "high."
    else:
        if dep_percent < 30:
            return "낮은"
        elif dep_percent < 70:
            return "보통"
        return "높은"
    

def make_mdd_report(dep_prob: float, RESULT_DIR: str, number='0000', name='Bwave', sex='M/F', age='00',
                     date=None, reportLanguage="kr"):
    """
    Args:
        dep_prob (float) : 우울 확률 (0~1)
        RESULT_DIR (str) : RESULT_DIR
        number, name, sex, age, date : 상단 측정자 정보 (다른 페이지들과 동일한 값 사용)
        reportLanguage (str) : "kr" | "en"
    """
    dep_percent = round(dep_prob * 100, 1)
    normal_percent = round(100 - dep_percent, 1)

    if reportLanguage == "en":
        BASE_DIR = directory.BASE_DIR_EN
        template_filename = TEMPLATE_FILENAME_EN
        header_y_frac = HEADER_Y_FRAC_EN
        header_x_frac = HEADER_X_FRAC_EN
        donut_center_frac = DONUT_CENTER_FRAC_EN
        comment_blank_frac = COMMENT_BLANK_FRAC_EN
        sex_disp = sex
        age_disp = age
    else:
        BASE_DIR = directory.BASE_DIR
        template_filename = TEMPLATE_FILENAME_KR
        header_y_frac = HEADER_Y_FRAC_KR
        header_x_frac = HEADER_X_FRAC_KR
        donut_center_frac = DONUT_CENTER_FRAC_KR
        comment_blank_frac = COMMENT_BLANK_FRAC_KR
        sex_disp = sex
        age_disp = '만 ' + str(age)

    template = Image.open(os.path.join(BASE_DIR, template_filename)).convert('RGB')
    W, H = template.size
    draw = ImageDraw.Draw(template)

    # ---- 1) 상단 측정자 정보 ----
    header_values = {
        'date': date,
        'number': number,
        'name': name,
        'sex': sex_disp,
        'age': age_disp,
    }
    header_y = H * header_y_frac
    for key, value in header_values.items():
        x = W * header_x_frac[key]
        draw.text((x, header_y), str(value), fill="black", font=Font_medium32, anchor="rm")

    # ---- 2) 도넛(우울증 확률 / 정상일 확률) ----
    PLOT.plot_mdd_score(dep_percent, 'mdd_dep', RESULT_DIR, colors=('#AAD2E6', "#5C7A99"), reportLanguage=reportLanguage)
    PLOT.plot_mdd_score(normal_percent, 'mdd_normal', RESULT_DIR, colors=('#BEEBD1', '#6FAE3C'), reportLanguage=reportLanguage)

    donut_dep = Image.open(os.path.join(RESULT_DIR, 'mdd_dep_score.png')).crop(DONUT_CROP_BOX).resize(DONUT_RESIZE)
    donut_normal = Image.open(os.path.join(RESULT_DIR, 'mdd_normal_score.png')).crop(DONUT_CROP_BOX).resize(DONUT_RESIZE)

    for donut_img, key in ((donut_dep, 'dep'), (donut_normal, 'normal')):
        cx, cy = donut_center_frac[key]
        cx, cy = W * cx, H * cy
        w, h = donut_img.size
        template.paste(donut_img, (int(cx - w / 2), int(cy - h / 2)), donut_img)

    # ---- 3) 종합 소견 문구 - 템플릿에 이미 있는 고정 문장의 빈칸만 채운다 ----
    blank_values = {
        'dep_percent': f"{dep_percent:.1f}%",
        'normal_percent': f"{normal_percent:.1f}%",
        'level': _level_text(dep_percent, reportLanguage),
    }
    for key, value in blank_values.items():
        x, y = comment_blank_frac[key]
        draw.text((W * x, H * y), value, fill=TEXT_COLOR, font=Font_comment, anchor="lm")

    template.save(os.path.join(RESULT_DIR, 'mdd_report.jpg'), quality=95)

    # 임시로 만든 도넛 png는 PDF_ALL.py 가 지우지 않으므로 여기서 바로 정리
    for f in ('mdd_dep_score.png', 'mdd_normal_score.png'):
        try:
            os.remove(os.path.join(RESULT_DIR, f))
        except OSError:
            pass
