"""
Сегментный анализ MOEX.

Анализирует отраслевые сегменты (банки, нефть/газ, металлы и т.д.)
перед анализом отдельных тикеров.

Запуск:
    python _analyze_segment.py                     # все сегменты
    python _analyze_segment.py banks               # только банки
    python _analyze_segment.py banks oil_gas       # банки + нефть/газ
"""

import sys
import json
from datetime import datetime

from src.analysis.segments import (
    MOEX_SEGMENTS,
    get_all_segments,
    analyze_segment,
    build_segment_index,
    get_segment_context_for_ticker,
)


def print_segment_report(segment: str, context: dict) -> None:
    """Вывод отчёта по сегменту."""
    seg_info = MOEX_SEGMENTS.get(segment, {})
    name_ru = seg_info.get('name_ru', segment)
    tickers = seg_info.get('tickers', [])
    summary = context.get('summary', {})

    print(f"\n{'=' * 60}")
    print(f"📊 СЕГМЕНТ: {name_ru} ({segment})")
    print(f"{'=' * 60}")
    print(f"  Тикеры: {', '.join(tickers)}")
    print(f"  Композитный тренд: {summary.get('composite_trend', '—')}")
    print(f"  Согласованность: {summary.get('trend_alignment', '—')}")
    print(f"  Средний RSI: {summary.get('avg_rsi', '—')}")

    analysis = context.get('analysis', {})
    for tf_name in ['W1', 'D1', 'H1']:
        tf = analysis.get(tf_name, {})
        if tf.get('has_data'):
            print(f"\n  ── {tf_name} ──")
            print(f"    Индекс: {tf.get('index_close', '—')}")
            print(f"    Тренд: {tf['trend']} | ADX: {tf.get('adx', '—')} "
                  f"| RSI: {tf.get('rsi', '—')}")
            print(f"    +DI: {tf.get('plus_di', '—')} | -DI: {tf.get('minus_di', '—')} | "
                  f"MACD hist: {tf.get('macd_hist', '—')}")
            print(f"    HA тренд: {tf.get('ha_trend', '—')} | "
                  f"EMA50: {tf.get('ema_50', '—')} | EMA200: {tf.get('ema_200', '—')}")
        else:
            print(f"\n  ── {tf_name} ──  Нет данных")

    # Вывод по каждому тикеру сегмента
    print(f"\n  ── Тикеры сегмента ──")
    for t in tickers:
        ctx = get_segment_context_for_ticker(t, tfs=['W1', 'D1', 'H1'])
        s = ctx.get('summary', {})
        comp_trend = s.get('composite_trend', '—')
        avg_rsi = s.get('avg_rsi', '—')
        rsi_str = f"{avg_rsi:.0f}" if isinstance(avg_rsi, (int, float)) else str(avg_rsi)
        print(f"    {t:6s}: тренд сегмента={str(comp_trend):10s} "
              f"RSI={rsi_str:>5s}")


def main():
    segments_to_analyze = sys.argv[1:] if len(sys.argv) > 1 else get_all_segments()

    print("=" * 60)
    print("СЕГМЕНТНЫЙ АНАЛИЗ MOEX")
    print(f"Дата: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
    print(f"Сегментов к анализу: {len(segments_to_analyze)}")
    print("=" * 60)

    results = {}
    for seg_name in segments_to_analyze:
        if seg_name not in MOEX_SEGMENTS:
            print(f"\n⚠ Сегмент '{seg_name}' не найден. Доступные: {', '.join(get_all_segments())}")
            continue

        try:
            context = get_segment_context_for_ticker(
                MOEX_SEGMENTS[seg_name]['tickers'][0],
                tfs=['W1', 'D1', 'H1'],
            )
            results[seg_name] = context
            print_segment_report(seg_name, context)
        except Exception as e:
            print(f"\n⚠ Ошибка анализа сегмента {seg_name}: {e}")
            import traceback
            traceback.print_exc()

    # Сохранение
    output = {
        'timestamp': datetime.now().isoformat(),
        'segments': results,
    }
    out_path = '/tmp/moex_segment_analysis.json'
    with open(out_path, 'w', encoding='utf-8') as f:
        json.dump(output, f, indent=2, ensure_ascii=False, default=str)
    print(f"\nРезультаты сохранены в {out_path}")

    # Сводка
    print(f"\n{'=' * 60}")
    print("СВОДКА ПО СЕГМЕНТАМ")
    print(f"{'=' * 60}")
    print(f"{'Сегмент':16s} {'Тренд':10s} {'RSI':>6s} {'ADX(W1)':>8s} {'ADX(D1)':>8s} "
          f"{'MACD(D1)':>9s}")
    print("-" * 60)
    for seg_name, ctx in results.items():
        seg_info = MOEX_SEGMENTS.get(seg_name, {})
        name_ru = seg_info.get('name_ru', seg_name)
        summary = ctx.get('summary', {})
        comp_trend = summary.get('composite_trend', '—')
        avg_rsi = summary.get('avg_rsi', '—')
        analysis = ctx.get('analysis', {})
        adx_w1 = analysis.get('W1', {}).get('adx', '—')
        adx_d1 = analysis.get('D1', {}).get('adx', '—')
        macd_d1 = analysis.get('D1', {}).get('macd_hist', '—')
        rsi_str = f"{avg_rsi:.0f}" if isinstance(avg_rsi, (int, float)) else str(avg_rsi)
        print(f"{name_ru:16s} {comp_trend:10s} {rsi_str:>6s} {str(adx_w1):>8s} "
              f"{str(adx_d1):>8s} {str(macd_d1):>9s}")

    return results


if __name__ == '__main__':
    main()
