o
    i&                     @   s~   d dl Z d dlZd dlmZ d dlmZ d dlmZ d dlm	Z	 dd Z
dd	 Zd
edefddZdd Zdd Zdd ZdS )    N)get_gemini_model)genai)types)get_usernamec                 C   s`   |dkrdS | | d }|dkrd}| |fS |dkr d}| |fS |dkr*d	}| |fS d
}| |fS )u   
    능력검사(言語/非言語) 등급 계산
    
    Args:
        correct_count: 정답 수
        total_count: 전체 문제 수
    
    Returns:
        tuple: (score, grade)
        - score: 정답 수
        - grade: A/B/C/D
    r   )r   Dd   P   A<   B(   Cr    )correct_counttotal_count
percentagegrader   r   :/home/air/goalskill_sales/back/app/services/spi_scoring.pycalculate_ability_grade
   s   r   c                 C   s  dddddd}g g g g g d}| D ])}| d}| d	d
}|s"qt| d  }|r;||v r;|| ||  qi }d}| D ]6\}}	|	rst|	t|	 }
|t|	7 }|
dkr_d}n	|
dkrfd}nd}t|
d|d||< qDddd||< qD||d< |S )u   
    성격검사 점수 계산 (입력값 유연화 적용)
    - "A"만 오거나 "A 当てはまる"가 와도 모두 처리 가능
                   )r	   r   r   r   E
positivitycooperation
resilienceresponsibilityplanningtraitselected_option r   g      @   高g      @u   中u   低)scorelevelu   測定不能total_score)	getstrstripupperappenditemssumlenround)answers	score_maptrait_scoresanswerr!   selected
first_charresultr'   scores	avg_scorer&   r   r   r   calculate_personality_scores(   s6   

r:   personality_resultreturnc                 C   s>   dddddd}i }|  D ]\}}|| v r| | ||< q|S )un   
    영어 키를 일본어로 변환하여 DB 저장용 딕셔너리 생성.
    total_score는 제외.
    	   積極性	   協調性   メンタル	   責任感	   計画性r   )r-   )r;   key_mapr7   eng_keyjp_keyr   r   r   format_personality_for_dbZ   s   rE   c                 C   s   d|  d| d| d}|S )u   
    SPI 결과 요약 메시지 생성
    
    Args:
        language_grade: 言語 등급 (A/B/C/D)
        nonverbal_grade: 非言語 등급 (A/B/C/D)
        personality_type: 性格 유형
    
    Returns:
        str: 요약 메시지
    u6   【SPI検査結果】

▼ 能力検査
言語能力: u   
非言語能力: u   

▼ 性格検査
u   

お疲れ様でした！r   )language_gradenonverbal_gradepersonality_typesummaryr   r   r   generate_spi_summarym   s   rJ   c              
   C   s.  ddl }|j  d}d}d}	t| }
|
r|
n| }zt|||}W n ty= } ztd|  d}W Y d}~nd}~ww dg d	| d
| d| d| d|	 d|	 d| d| d|	 d|	 d| d| d|	 d|	 d	| d	| d	}|S )uY   
    SPI 리포트 생성 (성격 부분은 리스트 없이 코멘트로만 대체)
    r   Nz%Y-%m-%d %H:%Mui   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ui   ───────────────────────────────────[SPI AI Comment Error] u   データを分析中です...r#   
u    
 SPI3 総合診断レポート
z
Name : z
Date : z

u   
【1】 言語 (Language)
u   
  ■ スコア : u    / 5
  ■ ランク : u    
【2】 非言語 (Non-verbal)
u   
【3】 性格・総評
)datetimenowstrftimer   generate_ai_comment	Exceptionprintjoin)
session_idlanguage_scorerF   nonverbal_scorerG   personality_scoresrM   now_str
thick_line	thin_lineusernamedisplay_name
ai_commentereport_textr   r   r   generate_professional_report   s^   
	
r`   c              
   C   s  g }dddddd}zst  }g }| D ]$\}}|| v r8| | dd}	|d	| d
|	  |	dkr8|| qd|}
t|dk}|dkpK|dk}d| d| d|
 d}|jjdtj	dtj
|dgdgtjddd}|j }|s{td|W S  ty } z>td|  t|dk}|rW Y d}~dS |rt|dkrd|dd n|d  }d!| d"W  Y d}~S W Y d}~d#S d}~ww )$uK   
    SPI 결과 AI 코멘트 생성 (능력치 + 성격 통합 분석)
    r=   r>   r@   rA   r?   )r   r   r   r    r   r&   -z- z: r$   rL   r   r   u   
あなたは企業の人事担当者です。
以下のSPI検査結果に基づき、**この人はどんな人か**を分析してください。

【検査結果】
[能力検査]
- 言語能力ランク: u   
- 非言語能力ランク: u   

[性格検査]
u  

【作成の指針】
1. **分析の視点**: 「この人はどんな人か」を客観적으로分析してください。
   - 個人の「好み」ではなく、仕事における「実務遂行能力」「組織適応力」「ストレス耐性」に焦点を当ててください。
   - 「この人は〜な人です」「〜なタイプです」という形式で記述してください。

2. **能力と性格の統合**: 
   - 能力ランクが高い場合: その知能と性格面の組み合わせで、どんな特徴があるかを分析してください。
   - **能力ランクが低い(C, D)場合**: 能力の結果には直接触れず、性格面の特徴を中心に「この人はどんな人か」を分析してください。
   
3. **All High（全項目が高い）の場合の対応**:
   - 絶対に「非現実的」「矛盾している」などの表現は避けてください。
   - 「組織適応力が高く、攻守のバランスが優れた万能型の人」「プレッシャーに強い強靭なメンタルの持ち主」として**客観的に分析**してください。

【制約事項】
- 言語: 自然な日本語
- 長さ: 100文字以内（簡潔に）
- 形式: 「この人は〜な人です」「〜なタイプです」「〜持ち主です」など、**「この人はどんな人か」を説明する形式**
- トーン: **客観的でプロフェッショナルな分析**（応援や励ましの言葉は使わない）
- 終わり方: 「〜人です」「〜タイプです」「〜持ち主です」など、**客観的な分析で終わる**（「自信を持ってください」「頑張ってください」などの応援メッセージは絶対に使わない）
- **結果が低くても、絶対に否定的な言葉（向いていない、ダメだ等）は使わないこと**

この人はどんな人か、分析してください:
zgemini-2.5-flashuser)text)rolepartsg?)temperature)modelcontentsconfigzEmpty response from AIrK   Nuc   組織適応力が高く、攻守のバランスが非常に優れた「万能型」の人です。r   u   とr   u   高いu3   を持つ、バランスの取れた人材です。u?   検査結果を基に、この人の特徴を分析中です。)r   r-   r(   r,   rS   r/   modelsgenerate_contentr   ContentPartGenerateContentConfigrc   r*   
ValueErrorrQ   rR   )rW   rF   rG   high_traitstrait_namesclientpersonality_lineskeynamer&   personality_textis_all_highhas_low_gradepromptresponser]   r^   	trait_strr   r   r   rP      sX   


%

&rP   )jsonrM   app.core.configr   googler   google.genair   app.models.general_moduler   r   r:   dictrE   rJ   r`   rP   r   r   r   r   <module>   s   27