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

使用例:
    python app.py
    # ブラウザで http://localhost:5000 にアクセス
"""
import os
import sys
import json
from datetime import datetime

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

from flask import Flask, render_template, request, send_file, jsonify, Response
from config import OUTPUT_DIR
from core.aggregator import ReportDataAggregator
from core.html_generator import MonthlyReportHTML
from core.llm_analyzer import LLMAnalyzer

app = Flask(__name__)


@app.route('/')
def index():
    """レポート生成フォーム"""
    current_year = datetime.now().year
    years = list(range(current_year - 2, current_year + 1))

    # デフォルト値（前月）
    today = datetime.now()
    if today.month == 1:
        default_year = today.year - 1
        default_month = 12
    else:
        default_year = today.year
        default_month = today.month - 1

    return render_template(
        'index.html',
        years=years,
        default_year=default_year,
        default_month=default_month
    )


@app.route('/generate', methods=['POST'])
def generate():
    """レポート生成・ダウンロード"""
    try:
        year = int(request.form.get('year'))
        month = int(request.form.get('month'))
        output_format = request.form.get('format', 'html')  # 'html' or 'pdf'
        use_llm = request.form.get('llm', 'false') == 'true'

        # バリデーション
        if not 1 <= month <= 12:
            return jsonify({'error': '月は1〜12の範囲で指定してください'}), 400

        # データ収集
        aggregator = ReportDataAggregator(year, month)
        data = aggregator.collect_all_data()

        # LLM分析（オプション）
        analyses = {}
        if use_llm:
            analyzer = LLMAnalyzer(enabled=True)
            if analyzer.enabled:
                analyses = analyzer.analyze_all(data)

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

        os.makedirs(OUTPUT_DIR, exist_ok=True)
        filename_base = f"monthly_report_{year}_{month:02d}"

        if output_format == 'pdf':
            # PDF生成
            output_path = os.path.join(OUTPUT_DIR, f"{filename_base}.pdf")
            try:
                report.generate_pdf(output_path)
                return send_file(
                    output_path,
                    as_attachment=True,
                    download_name=f"{filename_base}.pdf",
                    mimetype='application/pdf'
                )
            except ImportError as e:
                return jsonify({'error': f'PDF生成に失敗しました: {str(e)}'}), 500
        else:
            # HTML生成
            output_path = os.path.join(OUTPUT_DIR, f"{filename_base}.html")
            report.generate_html(output_path)
            return send_file(
                output_path,
                as_attachment=True,
                download_name=f"{filename_base}.html",
                mimetype='text/html'
            )

    except Exception as e:
        import traceback
        traceback.print_exc()
        return jsonify({'error': str(e)}), 500


@app.route('/report-preview')
def report_preview():
    """HTMLレポートプレビュー"""
    try:
        year = int(request.args.get('year', datetime.now().year))
        month = int(request.args.get('month', datetime.now().month - 1 or 12))
        use_llm = request.args.get('llm', 'false') == 'true'

        # バリデーション
        if not 1 <= month <= 12:
            return jsonify({'error': '月は1〜12の範囲で指定してください'}), 400

        # データ収集
        aggregator = ReportDataAggregator(year, month)
        data = aggregator.collect_all_data()

        # LLM分析（オプション）
        analyses = {}
        if use_llm:
            analyzer = LLMAnalyzer(enabled=True)
            if analyzer.enabled:
                analyses = analyzer.analyze_all(data)

        # HTMLを生成（ファイル出力なし）
        report = MonthlyReportHTML(data, analyses)
        html_content = report.generate_html()

        return Response(html_content, mimetype='text/html')

    except Exception as e:
        import traceback
        traceback.print_exc()
        return jsonify({'error': str(e)}), 500


@app.route('/preview')
def preview():
    """プレビュー（JSON形式でデータ確認用）"""
    try:
        year = int(request.args.get('year', datetime.now().year))
        month = int(request.args.get('month', datetime.now().month - 1 or 12))

        # バリデーション
        if not 1 <= month <= 12:
            return jsonify({'error': '月は1〜12の範囲で指定してください'}), 400

        aggregator = ReportDataAggregator(year, month)
        data = aggregator.collect_all_data()

        # datetime等をシリアライズ可能にする
        def json_serializer(obj):
            if hasattr(obj, 'isoformat'):
                return obj.isoformat()
            return str(obj)

        return app.response_class(
            response=json.dumps(data, indent=2, ensure_ascii=False, default=json_serializer),
            mimetype='application/json'
        )

    except Exception as e:
        return jsonify({'error': str(e)}), 500


@app.route('/health')
def health():
    """ヘルスチェックエンドポイント"""
    return jsonify({'status': 'ok', 'timestamp': datetime.now().isoformat()})


if __name__ == '__main__':
    # 出力ディレクトリを作成
    os.makedirs(OUTPUT_DIR, exist_ok=True)

    print("=" * 50)
    print("月次レポート生成サービス")
    print("=" * 50)
    print(f"アクセスURL: http://localhost:5000")
    print(f"データプレビュー: http://localhost:5000/preview?year=2026&month=1")
    print(f"レポートプレビュー: http://localhost:5000/report-preview?year=2026&month=1")
    print("=" * 50)

    app.run(debug=True, host='0.0.0.0', port=5000)
