#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
心理特征推断模块 - 人物画像技能
基于公开决策、危机应对、演讲风格，推断心理特征

创建时间：2026-04-03
开发者：瞰宇 (Kàn Yǔ)
"""

import json
from typing import Dict, List, Tuple, Optional
from dataclasses import dataclass
from collections import Counter


@dataclass
class BigFiveTraits:
    """大五人格特质"""
    openness: float  # 开放性（0-5）
    conscientiousness: float  # 尽责性（0-5）
    extraversion: float  # 外向性（0-5）
    agreeableness: float  # 宜人性（0-5）
    neuroticism: float  # 神经质（0-5）


@dataclass
class Machiavellianism:
    """马基雅维利主义倾向"""
    power_orientation: float  # 权力导向（0-5）
    manipulative_tendency: float  # 操纵倾向（0-5）
    transactional_orientation: float  # 交易倾向（0-5）


@dataclass
class RiskPreference:
    """风险偏好"""
    overall_risk_acceptance: str  # 总体风险接受度（低/中/高）
    political_risk: str  # 政治风险偏好
    reputation_risk: str  # 声誉风险偏好
    decision_mode: str  # 决策模式（冲动型/计算型/回避型）


@dataclass
class LeadershipStyle:
    """领导风格"""
    primary_style: str  # 主导风格
    secondary_style: str  # 次要风格
    characteristics: List[str]  # 特征


class PsychologyAnalyzer:
    """
    心理特征推断器
    基于公开决策、危机应对、演讲风格，推断心理特征
    """
    
    # 语言特征关键词（示例）
    LANGUAGE_INDICATORS = {
        "openness": ["创新", "新思想", "探索", "可能", "也许", "创新", "创新性"],
        "low_openness": ["传统", "应该", "必须", "规则", "秩序", "保守"],
        "conscientiousness": ["计划", "目标", "完成", "坚持", "责任", "义务"],
        "extraversion": ["我们", "一起", "合作", "团队", "大家", "领导"],
        "introversion": ["我", "我的", "独自", "个人", "独立"],
        "agreeableness": ["合作", "理解", "帮助", "支持", "和谐", "友善"],
        "low_agreeableness": ["对抗", "赢", "胜利", "击败", "竞争", "对手"],
        "neuroticism": ["担心", "害怕", "恐惧", "不安", "焦虑", "威胁"]
    }
    
    def __init__(self):
        """初始化心理特征推断器"""
        self.statements = []
        self.behaviors = []
        self.decisions = []
    
    def load_statements(self, statements: List[Dict]):
        """
        加载言论数据
        
        Args:
            statements: 言论列表
        """
        self.statements = statements
    
    def load_behaviors(self, behaviors: List[Dict]):
        """
        加载行为记录
        
        Args:
            behaviors: 行为记录列表
        """
        self.behaviors = behaviors
    
    def load_decisions(self, decisions: List[Dict]):
        """
        加决策案例
        
        Args:
            decisions: 决策案例列表
        """
        self.decisions = decisions
    
    def analyze_big_five_traits(self) -> BigFiveTraits:
        """
        分析大五人格特质
        
        Returns:
            BigFiveTraits对象
        """
        # 合并所有言论文本
        all_text = " ".join([s.get("content", "") for s in self.statements])
        text_lower = all_text.lower()
        
        # 计算各维度得分（0-5分制）
        openness = self._calculate_trait_score(
            text_lower,
            self.LANGUAGE_INDICATORS["openness"],
            self.LANGUAGE_INDICATORS["low_openness"]
        )
        
        conscientiousness = self._calculate_trait_score(
            text_lower,
            self.LANGUAGE_INDICATORS["conscientiousness"],
            []
        )
        
        extraversion_score = sum(
            1 for word in self.LANGUAGE_INDICATORS["extraversion"] 
            if word in text_lower
        )
        introversion_score = sum(
            1 for word in self.LANGUAGE_INDICATORS["introversion"] 
            if word in text_lower
        )
        extraversion = 3.0 + (extraversion_score - introversion_score) * 0.3
        extraversion = max(0.0, min(5.0, extraversion))
        
        agreeableness = self._calculate_trait_score(
            text_lower,
            self.LANGUAGE_INDICATORS["agreeableness"],
            self.LANGUAGE_INDICATORS["low_agreeableness"]
        )
        
        neuroticism = sum(
            1 for word in self.LANGUAGE_INDICATORS["neuroticism"] 
            if word in text_lower
        ) * 0.5 + 2.0
        neuroticism = min(5.0, neuroticism)
        
        return BigFiveTraits(
            openness=openness,
            conscientiousness=conscientiousness,
            extraversion=extraversion,
            agreeableness=agreeableness,
            neuroticism=neuroticism
        )
    
    def _calculate_trait_score(
        self, 
        text: str, 
        positive_indicators: List[str], 
        negative_indicators: List[str]
    ) -> float:
        """
        计算特质得分
        
        Args:
            text: 文本
            positive_indicators: 正向指标
            negative_indicators: 负向指标
            
        Returns:
            得分（0-5）
        """
        pos_count = sum(1 for word in positive_indicators if word in text)
        neg_count = sum(1 for word in negative_indicators if word in text)
        
        # 基础分2.5，正向加分，负向减分
        score = 2.5 + (pos_count - neg_count) * 0.3
        return max(0.0, min(5.0, score))
    
    def analyze_machiavellianism(self) -> Machiavellianism:
        """
        分析马基雅维利主义倾向
        
        Returns:
            Machiavellianism对象
        """
        all_text = " ".join([s.get("content", "") for s in self.statements])
        text_lower = all_text.lower()
        
        # 权力相关词汇
        power_words = ["权力", "控制", "领导", "统治", "权威", "权力", "力量"]
        manipulative_words = ["战略", "策略", "操纵", "利用", "博弈", "计算"]
        transactional_words = ["交易", "利益", "交换", "条件", "谈判", "妥协"]
        
        power_score = sum(1 for word in power_words if word in text_lower) * 0.4 + 3.0
        manipulative_score = sum(1 for word in manipulative_words if word in text_lower) * 0.4 + 2.5
        transactional_score = sum(1 for word in transactional_words if word in text_lower) * 0.4 + 2.5
        
        return Machiavellianism(
            power_orientation=min(5.0, power_score),
            manipulative_tendency=min(5.0, manipulative_score),
            transactional_orientation=min(5.0, transactional_score)
        )
    
    def analyze_risk_preference(self) -> RiskPreference:
        """
        分析风险偏好
        
        Returns:
            RiskPreference对象
        """
        # 分析决策案例中的风险模式
        risk_taking_count = 0
        risk_avoiding_count = 0
        
        for decision in self.decisions:
            description = decision.get("description", "").lower()
            
            if any(word in description for word in ["冒险", "突破", "激进", "大胆"]):
                risk_taking_count += 1
            elif any(word in description for word in ["谨慎", "保守", "稳妥", "渐进"]):
                risk_avoiding_count += 1
        
        # 判断总体风险偏好
        if risk_taking_count > risk_avoiding_count:
            overall = "高"
        elif risk_avoiding_count > risk_taking_count:
            overall = "低"
        else:
            overall = "中"
        
        # 决策模式（简化版）
        decision_mode = "计算型"  # 默认
        
        return RiskPreference(
            overall_risk_acceptance=overall,
            political_risk="高",  # 示例值
            reputation_risk="中",  # 示例值
            decision_mode=decision_mode
        )
    
    def analyze_leadership_style(self) -> LeadershipStyle:
        """
        分析领导风格
        
        Returns:
            LeadershipStyle对象
        """
        all_text = " ".join([s.get("content", "") for s in self.statements])
        text_lower = all_text.lower()
        
        # 判断主导风格
        authoritarian_words = ["必须", "坚决", "命令", "服从", "强制"]
        democratic_words = ["讨论", "协商", "倾听", "民主", "共识"]
        charismatic_words = ["激励", "鼓舞", "愿景", "梦想", "希望"]
        transactional_words = ["交易", "交换", "利益", "奖励", "惩罚"]
        
        authoritarian_score = sum(1 for word in authoritarian_words if word in text_lower)
        democratic_score = sum(1 for word in democratic_words if word in text_lower)
        charismatic_score = sum(1 for word in charismatic_words if word in text_lower)
        transactional_score = sum(1 for word in transactional_words if word in text_lower)
        
        # 确定主导和次要风格
        scores = {
            "专制型": authoritarian_score,
            "民主型": democratic_score,
            "魅力型": charismatic_score,
            "交易型": transactional_score
        }
        
        sorted_styles = sorted(scores.items(), key=lambda x: x[1], reverse=True)
        primary_style = sorted_styles[0][0]
        secondary_style = sorted_styles[1][0]
        
        # 提取特征
        characteristics = []
        if authoritarian_score > democratic_score:
            characteristics.append("高度集权")
            characteristics.append("快速决策")
        else:
            characteristics.append("协商决策")
            characteristics.append("团队参与")
        
        if charismatic_score > 0:
            characteristics.append("强情感动员")
            characteristics.append("个人魅力依赖")
        
        return LeadershipStyle(
            primary_style=primary_style,
            secondary_style=secondary_style,
            characteristics=characteristics
        )
    
    def generate_psychology_report(self) -> Dict:
        """
        生成心理特征推断报告
        
        Returns:
            分析报告字典
        """
        # 分析各维度
        big_five = self.analyze_big_five_traits()
        machiavellianism = self.analyze_machiavellianism()
        risk_preference = self.analyze_risk_preference()
        leadership_style = self.analyze_leadership_style()
        
        report = {
            "大五人格特质": {
                "开放性": f"{big_five.openness:.1f}/5.0",
                "尽责性": f"{big_five.conscientiousness:.1f}/5.0",
                "外向性": f"{big_five.extraversion:.1f}/5.0",
                "宜人性": f"{big_five.agreeableness:.1f}/5.0",
                "神经质": f"{big_five.neuroticism:.1f}/5.0"
            },
            "马基雅维利主义": {
                "权力导向": f"{machiavellianism.power_orientation:.1f}/5.0",
                "操纵倾向": f"{machiavellianism.manipulative_tendency:.1f}/5.0",
                "交易倾向": f"{machiavellianism.transactional_orientation:.1f}/5.0"
            },
            "风险偏好": {
                "总体风险接受度": risk_preference.overall_risk_acceptance,
                "政治风险": risk_preference.political_risk,
                "声誉风险": risk_preference.reputation_risk,
                "决策模式": risk_preference.decision_mode
            },
            "领导风格": {
                "主导风格": leadership_style.primary_style,
                "次要风格": leadership_style.secondary_style,
                "特征": leadership_style.characteristics
            },
            "警告": "心理推断基于公开信息，存在不确定性。建议作为参考而非绝对判断。"
        }
        
        return report


def main():
    """测试心理特征推断器"""
    analyzer = PsychologyAnalyzer()
    
    # 示例言论数据
    statements = [
        {"content": "我们必须坚持传统，维护秩序，这是最重要的。"},
        {"content": "我带领大家实现我们的目标！"},
        {"content": "我们将击败所有对手，赢得胜利！"},
        {"content": "我担心外部威胁会威胁我们的安全。"}
    ]
    
    analyzer.load_statements(statements)
    
    # 生成报告
    print("=== 心理特征推断报告 ===")
    report = analyzer.generate_psychology_report()
    print(json.dumps(report, ensure_ascii=False, indent=2))


if __name__ == "__main__":
    main()
