#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
患者服务层
处理患者数据相关的业务逻辑
"""

import json
import os
from config import get_clinic_info

def load_clinic_patients(clinic_id):
    """加载指定门诊的患者数据，返回(patients, doctors)元组"""
    try:
        # 获取门诊信息
        clinic_info = get_clinic_info(clinic_id)
        clinic_name = clinic_info.get('clinic_name', '未知门诊')

        patients = []

        # 首先尝试从数据库加载
        try:
            from database.models import Patient
            db_patients = Patient.query.filter_by(clinic_name=clinic_name).all()
            if db_patients:
                patients = [patient.to_dict() for patient in db_patients]
                print(f"✅ 从数据库加载 {clinic_name} 患者数据成功: {len(patients)} 名患者")
        except Exception as db_error:
            print(f"⚠️  数据库查询失败: {db_error}")

        # 如果数据库没有数据，从文件系统加载
        if not patients:
            # 优先尝试读取单独的门诊文件
            json_file_path = f'data/patients/clinics/{clinic_name}.json'
            if os.path.exists(json_file_path):
                print(f"📁 从门诊文件加载患者数据: {json_file_path}")
                with open(json_file_path, 'r', encoding='utf-8') as f:
                    patients = json.load(f)
                print(f"✅ 加载 {clinic_name} 患者数据成功: {len(patients)} 名患者")
            else:
                # 最后尝试读取合并结果文件
                merged_file_path = 'data/patients/merged/合并结果.json'
                if os.path.exists(merged_file_path):
                    print(f"📁 从合并文件加载患者数据: {merged_file_path}")
                    with open(merged_file_path, 'r', encoding='utf-8') as f:
                        all_data = json.load(f)

                    # 筛选出指定门诊的患者（使用最后一次就诊诊所字段）
                    clinic_patients = []

                    # 创建门诊名称映射表
                    clinic_name_mapping = {
                        '学前街门诊': '江苏瑞泰通善口腔学前街医院',
                        '大丰门诊': '江苏瑞泰通善口腔大丰医院',
                        '东亭门诊': '江苏瑞泰通善口腔东亭医院',
                        '河埒门诊': '江苏瑞泰通善口腔河埒医院',
                        '红豆门诊': '江苏瑞泰通善口腔红豆医院',
                        '惠山门诊': '江苏瑞泰通善口腔惠山医院',
                        '马山门诊': '江苏瑞泰通善口腔马山医院',
                        '通善口腔医院': '江苏瑞泰通善口腔医院',
                        '新吴门诊': '江苏瑞泰通善口腔新吴医院'
                    }

                    # 获取实际的门诊名称
                    actual_clinic_name = clinic_name_mapping.get(clinic_name, clinic_name)

                    for patient in all_data:
                        last_clinic = patient.get('最后一次就诊诊所', '')
                        if actual_clinic_name in last_clinic or clinic_name in last_clinic:
                            clinic_patients.append(patient)

                    patients = clinic_patients
                    print(f"✅ 从合并文件加载 {clinic_name} 患者数据成功: {len(clinic_patients)} 名患者")

        # 提取医生列表
        doctors = set()
        for patient in patients:
            doctor = patient.get('最后一次就诊医生')
            if doctor and doctor.strip():
                doctors.add(doctor.strip())

        doctors_list = sorted(list(doctors))
        print(f"✅ 加载 {clinic_name} 患者数据: {len(patients)} 人, {len(doctors_list)} 位医生")
        return patients, doctors_list

    except Exception as e:
        print(f"❌ 加载患者数据失败: {e}")
        return [], []

def format_callback_script(script):
    """格式化回访话术为HTML显示"""
    if not script:
        return None

    try:
        import re

        # 移除开头的JSON部分
        script = re.sub(r'^```json.*?```\n', '', script, flags=re.DOTALL)

        # 分割各个部分
        sections = []
        current_section = None
        current_content = []

        lines = script.split('\n')
        for line in lines:
            line = line.strip()
            if not line:
                continue

            # 检查是否是新的部分标题
            if line.startswith('═══') and '部分：' in line:
                # 保存上一个部分
                if current_section and current_content:
                    sections.append({
                        'title': current_section,
                        'content': current_content.copy()
                    })

                # 开始新的部分
                current_section = line.replace('═══', '').strip()
                current_content = []
            elif line.startswith('•'):
                # 添加内容项
                current_content.append(line[1:].strip())
            elif line.startswith('**') and line.endswith('**'):
                # 子标题
                current_content.append(f"<strong>{line[2:-2]}</strong>")
            elif line and current_section:
                # 其他内容
                current_content.append(line)

        # 保存最后一个部分
        if current_section and current_content:
            sections.append({
                'title': current_section,
                'content': current_content.copy()
            })

        # 生成HTML
        if not sections:
            return script  # 如果解析失败，返回原始内容

        html_parts = []
        colors = [
            ('bg-blue-100', 'border-blue-500', 'text-blue-800'),
            ('bg-yellow-100', 'border-yellow-500', 'text-yellow-800'),
            ('bg-green-100', 'border-green-500', 'text-green-800'),
            ('bg-purple-100', 'border-purple-500', 'text-purple-800')
        ]

        for i, section in enumerate(sections):
            bg_color, border_color, text_color = colors[i % len(colors)]

            content_html = []
            for item in section['content']:
                if item.startswith('<strong>'):
                    content_html.append(f'<div class="font-semibold mt-2 mb-1">{item}</div>')
                else:
                    content_html.append(f'<div class="mb-1">• {item}</div>')

            section_html = f'''
            <div class="mb-6 p-4 {bg_color} border-l-4 {border_color} rounded-lg">
                <h4 class="font-bold {text_color} mb-3 flex items-center">
                    <i class="fas fa-comment mr-2"></i>{section['title']}
                </h4>
                <div class="text-gray-700 leading-relaxed">
                    {''.join(content_html)}
                </div>
            </div>'''

            html_parts.append(section_html)

        return ''.join(html_parts)

    except Exception as e:
        print(f"❌ 格式化回访话术失败: {e}")
        return script  # 返回原始内容

def load_callback_script(clinic_id, patient_id):
    """加载患者的回访话术"""
    try:
        # 获取门诊信息
        clinic_info = get_clinic_info(clinic_id)
        clinic_name = clinic_info.get('clinic_name', '未知门诊')

        # 尝试多种文件名格式
        possible_files = [
            f'data/callbacks/中间结果_{clinic_name}.json',
            f'data/callbacks/中间结果_{clinic_name}_*.json'
        ]

        # 查找匹配的文件
        import glob
        for pattern in possible_files:
            if '*' in pattern:
                # 使用glob查找带时间戳的文件
                matching_files = glob.glob(pattern)
                if matching_files:
                    # 使用最新的文件
                    callback_file = max(matching_files, key=os.path.getmtime)
                    break
            else:
                if os.path.exists(pattern):
                    callback_file = pattern
                    break
        else:
            print(f"⚠️  未找到 {clinic_name} 的回访话术文件")
            return "暂无个性化回访话术，请使用通用话术进行回访。"

        # 读取回访话术文件
        with open(callback_file, 'r', encoding='utf-8') as f:
            callback_data = json.load(f)

        # 查找指定患者的回访话术
        if 'callbacks' in callback_data:
            for callback in callback_data['callbacks']:
                if callback.get('patient_id') == patient_id or callback.get('病历号') == patient_id:
                    script = callback.get('callback_script') or callback.get('回访话术', '')
                    if script:
                        print(f"✅ 找到患者 {patient_id} 的回访话术，长度: {len(script)}")
                        return format_callback_script(script)

        print(f"⚠️  未找到患者 {patient_id} 的个性化回访话术")
        return "暂无个性化回访话术，请使用通用话术进行回访。"

    except Exception as e:
        print(f"❌ 加载回访话术失败: {e}")
        return "加载回访话术失败，请使用通用话术进行回访。"

def get_patient_by_id(clinic_id, patient_id):
    """根据患者ID获取患者详细信息"""
    try:
        patients, _ = load_clinic_patients(clinic_id)
        for patient in patients:
            if patient.get('病历号') == patient_id:
                return patient
        return None
    except Exception as e:
        print(f"❌ 获取患者信息失败: {e}")
        return None
