import os
import sys
root_path = os.getcwd()
sys.path.append(root_path)

import time
import datetime
import signal
import uvicorn
import pandas as pd
from fastapi import FastAPI, Request
from pydantic import BaseModel
from typing import List
from fastapi.middleware.cors import CORSMiddleware
import logging
import matplotlib.pyplot as plt
import argparse
import numpy as np
import yaml
import threading
import pickle
from fastapi.responses import FileResponse
from fastapi.staticfiles import StaticFiles

# 定义单个样本的特征类
class Features(BaseModel):
    # 10个SCL评测量（后续再处理）范围0-4
    somatization: float
    obsessive_compulsive: float
    interpersonal_sensitivity: float
    depression: float
    anxiety: float
    hostility: float
    terror: float
    paranoia: float
    psychoticism: float
    other: float
    # 基本信息特征量
    father_parenting_style: int # 温暖与理解：1；其他：0
    mother_parenting_style: int # 温暖与理解：1；其他：0
    self_assessed_family_economic_condition: int # 贫困：2；较差：1；其他：0
    history_of_psychological_counseling: bool # 有：1；无：0
    # 日常行为特征量
    absenteeism_above_average: bool # 大于平均次数：1；小于等于：0
    academic_warning: bool # 有预警：1；无预警：0
    # 标签
    label: int # 0-3 共4个类别

def process_features_list(features_list: List[dict]) -> List[Features]:
    """
    将包含字典的列表转换为包含 Features 实例的列表
    """
    return [Features(**features_dict) for features_dict in features_list]

def create_feature_df(features_list):
    """
    根据features_list对象创建一个DataFrame。
    
    参数:
    features_list (Features): 包含特征值的对象的数组
    
    返回:
    pandas.DataFrame: 包含特征和标签的DataFrame
    """

    # 定义一个空的 DataFrame 用于存储所有样本特征
    all_features = pd.DataFrame()

    for features in features_list:
        relevant_features = {
            "somatization": features.somatization,
            "obsessive_compulsive": features.obsessive_compulsive,
            "interpersonal_sensitivity": features.interpersonal_sensitivity,
            "depression": features.depression,
            "anxiety": features.anxiety,
            "hostility": features.hostility,
            "terror": features.terror,
            "paranoia": features.paranoia,
            "psychoticism": features.psychoticism,
            "other": features.other
        }
        df_feature = pd.DataFrame({
            # 数字化特征--基本信息
            '父亲教养方式数字化': [(lambda x: 0.59 if x == 1 else 0.46)(features.father_parenting_style)],
            '母亲教养方式数字化': [(lambda x: 0.69 if x == 1 else 0.56)(features.mother_parenting_style)],
            '自评家庭经济条件数字化': [(lambda x: 0.54 if x in [2, 1] else 0.47)(features.self_assessed_family_economic_condition)],
            '有无心理治疗（咨询）史数字化': [(lambda x: 0.21 if x else 0.09)(features.history_of_psychological_counseling)],
            # 数字化特征--症状因子
            '强迫症状数字化': [features.obsessive_compulsive / 4],
            '人际关系敏感数字化': [features.interpersonal_sensitivity / 4],
            '抑郁数字化': [features.depression / 4],
            '多因子症状': [(lambda x: sum(1 for value in x.values() if value > 3.0) / 10)(relevant_features)],
            # 数字化特征--日常行为
            '出勤情况数字化': [0.74 if features.absenteeism_above_average else 0.67],
            '学业情况数字化': [0.59 if features.academic_warning else 0.50],
            "类别": [features.label]
        })
        all_features = pd.concat([all_features, df_feature], ignore_index=True)

    return all_features

def apply_feature_weights(df, feature_names, feature_weights):
    """
    将特征权重应用到DataFrame中。
    
    参数:
    df (pandas.DataFrame): 包含特征和标签的DataFrame
    feature_names (list): 特征名称列表
    feature_weights (list): 特征权重列表
    
    返回:
    pandas.DataFrame: 应用权重后的DataFrame
    """
    # 找到最大值
    max_value = max(feature_weights)

    # 缩放权重
    feature_weights_scaled = [x / max_value for x in feature_weights]

    # 打印缩放后的特征权重
    # print("Scaled Feature Weights:", feature_weights_scaled)

    # 将特征和标签分开，并做归一化处理
    X = df[feature_names].values
    y = df['类别'].values

    # 分别乘以权重，放在归一化后
    for i in range(len(feature_names)):
        X[:, i] = X[:, i] * feature_weights_scaled[i]

    feature_label_weighted = pd.DataFrame(X, columns=feature_names)
    feature_label_weighted['类别'] = y

    return feature_label_weighted