#!/usr/bin/env python3
"""
月次レポート生成サービス - CLIエントリーポイント

使用例:
    python main.py --year 2026 --month 1
    python main.py --year 2026 --month 1 --html     # HTMLのみ
    python main.py --year 2026 --month 1 --pdf      # PDFのみ
    python main.py --year 2026 --month 1 --llm      # LLM分析有効
"""
import argparse
import os
import sys
from datetime import datetime

# パスを追加
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))

from config import OUTPUT_DIR, LLM_ANALYSIS_ENABLED
from core.aggregator import ReportDataAggregator
from core.html_generator import MonthlyReportHTML
from core.llm_analyzer import LLMAnalyzer


def main():
    parser = argparse.ArgumentParser(
        description='治験チャットボット月次レポート生成',
        formatter_class=argparse.RawDescriptionHelpFormatter,
        epilog='''
使用例:
  python main.py                        # 前月のレポートを生成（HTML+PDF）
  python main.py --year 2026 --month 1  # 2026年1月のレポートを生成
  python main.py --html                 # HTMLのみ生成
  python main.py --pdf                  # PDFのみ生成
  python main.py --llm                  # LLM分析コメント付きで生成
        '''
    )
    parser.add_argument(
        '--year', '-y',
        type=int,
        default=None,
        help='対象年（デフォルト: 前月の年）'
    )
    parser.add_argument(
        '--month', '-m',
        type=int,
        default=None,
        help='対象月（デフォルト: 前月）'
    )
    parser.add_argument(
        '--output', '-o',
        type=str,
        default=None,
        help='出力ファイルパス（拡張子なし、デフォルト: output/monthly_report_YYYY_MM）'
    )
    parser.add_argument(
        '--preview',
        action='store_true',
        help='プレビューモード（データのみ表示、ファイル生成なし）'
    )

    # 出力形式オプション
    format_group = parser.add_mutually_exclusive_group()
    format_group.add_argument(
        '--html',
        action='store_true',
        dest='html_only',
        help='HTMLのみ生成'
    )
    format_group.add_argument(
        '--pdf',
        action='store_true',
        dest='pdf_only',
        help='PDFのみ生成'
    )

    # LLM分析オプション
    llm_group = parser.add_mutually_exclusive_group()
    llm_group.add_argument(
        '--llm',
        action='store_true',
        dest='llm_enabled',
        default=None,
        help='LLM分析コメントを強制的に有効化'
    )
    llm_group.add_argument(
        '--no-llm',
        action='store_false',
        dest='llm_enabled',
        help='LLM分析コメントを強制的に無効化'
    )

    args = parser.parse_args()

    # デフォルト値の設定（前月）
    today = datetime.now()
    if args.year is None or args.month is None:
        if today.month == 1:
            year = today.year - 1
            month = 12
        else:
            year = today.year
            month = today.month - 1
    else:
        year = args.year
        month = args.month

    # 月の妥当性チェック
    if not 1 <= month <= 12:
        print(f"エラー: 月は1〜12の範囲で指定してください（指定値: {month}）")
        sys.exit(1)

    # 出力形式の決定
    generate_html = not args.pdf_only
    generate_pdf = not args.html_only

    print(f"=== 月次レポート生成 ===")
    print(f"対象期間: {year}年{month}月")
    print(f"出力形式: {'HTML' if generate_html else ''}{' + ' if generate_html and generate_pdf else ''}{'PDF' if generate_pdf else ''}")
    print()

    # データ収集
    print("データを収集中...")
    try:
        aggregator = ReportDataAggregator(year, month)
        data = aggregator.collect_all_data()
    except Exception as e:
        import traceback
        print(f"エラー: データ収集に失敗しました: {e}")
        traceback.print_exc()
        sys.exit(1)

    # プレビューモード
    if args.preview:
        import json
        print("\n=== プレビュー（JSON形式） ===")
        # datetime等をシリアライズ可能にする
        def json_serializer(obj):
            if hasattr(obj, 'isoformat'):
                return obj.isoformat()
            return str(obj)
        print(json.dumps(data, indent=2, ensure_ascii=False, default=json_serializer))
        return

    # サマリー表示
    summary = data['summary']
    print(f"  総会話数: {summary['total_conversations']:,}件")
    print(f"  自動解決率: {summary['resolution_rate']}%")
    print(f"  満足度: {summary['satisfaction_rate']}%")
    print()

    # LLM分析（有効な場合）
    llm_enabled = args.llm_enabled if args.llm_enabled is not None else LLM_ANALYSIS_ENABLED
    analyzer = LLMAnalyzer(enabled=llm_enabled)
    analyses = {}

    if analyzer.enabled:
        print("LLM分析を実行中...")
        analyses = analyzer.analyze_all(data)
        if analyses:
            print(f"  {len(analyses)}セクションの分析が完了しました")
        else:
            print("  警告: LLM分析結果が得られませんでした")
    else:
        if args.llm_enabled is False:
            print("LLM分析: 無効化されています（--no-llmオプション）")
        elif not LLM_ANALYSIS_ENABLED:
            print("LLM分析: 設定で無効化されています")

    # 出力パスの決定
    os.makedirs(OUTPUT_DIR, exist_ok=True)
    if args.output:
        base_path = args.output
        # 拡張子があれば除去
        if base_path.endswith('.html') or base_path.endswith('.pdf'):
            base_path = os.path.splitext(base_path)[0]
    else:
        base_path = os.path.join(OUTPUT_DIR, f"monthly_report_{year}_{month:02d}")

    # レポート生成
    report = MonthlyReportHTML(data, analyses)
    output_files = []

    try:
        # HTML生成
        if generate_html:
            html_path = f"{base_path}.html"
            print("HTMLを生成中...")
            report.generate_html(html_path)
            output_files.append(html_path)

        # PDF生成
        if generate_pdf:
            pdf_path = f"{base_path}.pdf"
            print("PDFを生成中...")
            try:
                report.generate_pdf(pdf_path)
                output_files.append(pdf_path)
            except ImportError as e:
                print(f"警告: PDF生成をスキップしました - {e}")
            except Exception as e:
                print(f"警告: PDF生成に失敗しました - {e}")
                if not generate_html:
                    raise

    except Exception as e:
        import traceback
        print(f"エラー: レポート生成に失敗しました: {e}")
        traceback.print_exc()
        sys.exit(1)

    print()
    print(f"=== 完了 ===")
    for path in output_files:
        print(f"出力: {os.path.abspath(path)}")


if __name__ == '__main__':
    main()
