"""高度なトレンド予測ロジックを提供するモジュール。

このモジュールは、4つの異なる視点（ダッシュボード）から市場を分析し、
総合的なトレンド予測とリスク評価を行う関数を提供します。
"""

import pandas as pd
import numpy as np
from ..indicators.sma import calculate_ema, calculate_sma
from ..indicators.rsi import calculate_rsi

def analyze_advanced_trend(daily_df, h4_df, h1_df, patterns=None):
    """高度な4つのダッシュボード指標に基づいた高精度トレンド予測を実行する。

    以下の4つの観点からスコアリングを行います：
    1. 長期トレンド (EMA Perfect Order)
    2. モメンタム (EMA乖離)
    3. ボラティリティ加速
    4. センチメント (重要ライン・パターン)

    Args:
        daily_df (pd.DataFrame): 日足データ。
        h4_df (pd.DataFrame): 4時間足データ。
        h1_df (pd.DataFrame): 1時間足データ。
        patterns (dict, optional): 検知されたチャートパターン情報。
            例: {'double_top': True, 'neckline': 2500.0}

    Returns:
        dict: 分析結果を含む辞書。
            - dashboard_1~4: 各区分の判定結果
            - final_prediction: 最終的な方向性予測
            - risk_level: リスク評価
            - comment: 詳細コメント
    """
    results = {
        'dashboard_1_trend': '不明',
        'dashboard_2_momentum': '不明',
        'dashboard_3_volatility': '不明',
        'dashboard_4_sentiment': '不明',
        'final_prediction': '様子見',
        'risk_level': '中',
        'comment': ''
    }

    # データ不足チェック
    if daily_df.empty or h4_df.empty or h1_df.empty:
        results['comment'] = "十分なデータがありません。"
        return results

    # =========================================================================
    # --- Dashboard 1: 長期トレンド分析 (EMAパーフェクトオーダー) ---
    # 役割: 相場の「大きな流れ」がどちらを向いているかを判定します。
    # ロジック: 20日, 50日, 200日のEMA（指数平滑移動平均）の並び順を確認。
    # =========================================================================
    h4_ema20 = calculate_ema(h4_df, 20).iloc[-1]
    h4_ema50 = calculate_ema(h4_df, 50).iloc[-1]
    h4_ema200 = calculate_ema(h4_df, 200).iloc[-1]
    h4_close = h4_df['Close'].iloc[-1]

    # 下落のパーフェクトオーダー: 短期 < 中期 < 長期 の順で、価格が一番下にある状態
    if h4_close < h4_ema20 < h4_ema50 < h4_ema200:
        results['dashboard_1_trend'] = 'パーフェクトオーダー (強気下降)'
    # 上昇のパーフェクトオーダー: 長期 < 中期 < 短期 の順で、価格が一番上にある状態
    elif h4_close > h4_ema20 > h4_ema50 > h4_ema200:
        results['dashboard_1_trend'] = 'パーフェクトオーダー (強気上昇)'
    else:
        results['dashboard_1_trend'] = 'トレンド転換点/混在'

    # =========================================================================
    # --- Dashboard 2: モメンタム分析 (EMA乖離率) ---
    # 役割: 現在の価格が「行き過ぎ」ていないか、あるいは強い勢いがあるかを判定します。
    # ロジック: 1時間足の現在値とEMA 20の距離（乖離率）を計算。
    # =========================================================================
    h1_ema20 = calculate_ema(h1_df, 20).iloc[-1]
    h1_close = h1_df['Close'].iloc[-1]
    dist_ema20 = (h1_close - h1_ema20) / h1_ema20
    
    # 0.5% 以上の乖離を一つの基準として勢いを判定
    if dist_ema20 < -0.005:
        results['dashboard_2_momentum'] = '下落の勢い強い'
    elif dist_ema20 > 0.005:
        results['dashboard_2_momentum'] = '上昇の勢い強い'
    else:
        results['dashboard_2_momentum'] = '穏やか'

    # =========================================================================
    # --- Dashboard 3: ボラティリティ分析 (価格変動の加速) ---
    # 役割: 相場が「動き始めた」タイミング（爆発力）を検知します。
    # ロジック: 直近3本のローソク足の平均値幅を、過去20本の平均値幅と比較。
    # =========================================================================
    recent_range = (h1_df['High'] - h1_df['Low']).tail(3).mean()
    avg_range = (h1_df['High'] - h1_df['Low']).tail(20).mean()
    
    # 値幅が平均の1.5倍を超えたら「加速状態」とみなす
    if recent_range > avg_range * 1.5:
        results['dashboard_3_volatility'] = 'ブレイクアウト/加速中'
        accel_factor = 1.5 # 予測スコアに倍率をかける
    else:
        results['dashboard_3_volatility'] = '安定'
        accel_factor = 1.0

    # =========================================================================
    # --- Dashboard 4: 市場センチメント (重要ライン・パターン) ---
    # 役割: 決定的な節目（サポート・レジスタンス）の突破やパターンを判定。
    # ロジック: 直近50本の高値・安値の更新、およびダブルトップ等のパターン検知。
    # =========================================================================
    h1_low_50 = h1_df['Low'].tail(50).min()
    h1_high_50 = h1_df['High'].tail(50).max()
    
    pattern_risk = 0
    # ダブルトップ検知時の処理
    if patterns and patterns.get('double_top'):
        neckline = patterns.get('neckline', 0)
        # ネックライン（谷）を割り込んでいる場合は「暴落確定」レベルの強い売りシグナル
        if h1_close < neckline:
            results['dashboard_4_sentiment'] = '重要ライン割れ (暴落確定)'
            pattern_risk = -5
        else:
            results['dashboard_4_sentiment'] = '重要ラインでの攻防'
    else:
        # 特別なパターンがない場合は、50期間の高値・安値を基準にする
        if h1_close <= h1_low_50:
            results['dashboard_4_sentiment'] = '新安値更新'
            pattern_risk = -2
        elif h1_close >= h1_high_50:
            results['dashboard_4_sentiment'] = '新高値更新'
            pattern_risk = 2
        else:
            results['dashboard_4_sentiment'] = 'レンジ内'

    # =========================================================================
    # --- 最終判定アルゴリズム (スコアリングシステム) ---
    # 役割: 4つのダッシュボードの結果を統合し、一つの最終予測を導き出します。
    # =========================================================================
    score = 0
    # 1. 長期トレンドの影響 (配点: +/- 3)
    if '下降' in results['dashboard_1_trend']: score -= 3
    if '上昇' in results['dashboard_1_trend']: score += 3
    
    # 2. モメンタムの影響 (配点: +/- 1)
    if '下落' in results['dashboard_2_momentum']: score -= 1
    if '上昇' in results['dashboard_2_momentum']: score += 1
    
    # 3. センチメントと、ボラティリティによる増幅
    # (score + 重要ライン割れリスク) に対して、値幅が拡大していれば最大1.5倍の加重を行う
    score = (score + pattern_risk) * accel_factor

    # スコアに基づいた最終判定の分類
    if score <= -6:
        results['final_prediction'] = '⚠️ 大暴落加速 (Great Crash Acceleration)'
        results['risk_level'] = '極めて高い'
        results['comment'] = "長期下降トレンド、重要ライン割れ、ボラティリティ拡大が全て揃いました。トレンドの底が見えません。"
    elif score >= 6:
        results['final_prediction'] = '🚀 急騰加速 (Surge Acceleration)'
        results['risk_level'] = '高い'
        results['comment'] = "レジスタンスを突破し、強い上昇モメンタムが発生しています。さらなる上値を狙う展開です。"
    elif score < 0:
        results['final_prediction'] = '続落注意'
        results['risk_level'] = '中'
        results['comment'] = "下落バイアスが強いですが、本格的な加速（暴落）にはまだ至っていません。"
    else:
        results['final_prediction'] = '底堅い/反発'
        results['risk_level'] = '低'
        results['comment'] = "買い圧力が優勢、またはレンジ下限での反発が見られます。"

    return results
