#!/usr/bin/env python3
"""
Money Forward Style Financial Report Generator

Usage:
    python -m src.main html                    # Generate HTML report (recommended)
    python -m src.main html --output report.html
    python -m src.main pdf                     # Generate PDF report
    python -m src.main list                    # List sheets
"""
import argparse
from pathlib import Path
from datetime import datetime

from .config import OUTPUT_DIR, COMPANY_INFO
from .sheets_client import sheets_client
from .data_fetcher import fetch_comparison_data
from .data_parser import build_financial_report


def generate_html_report(
    target_month: str = None,
    output_path: Path = None,
    open_after: bool = False,
) -> Path:
    """Generate HTML report

    Args:
        target_month: Target month (e.g., '2025-10')
        output_path: Output path
        open_after: Open after generation

    Returns:
        Generated HTML path
    """
    from .html.generator import HTMLReportGenerator

    print("📊 Financial Report Generation (HTML)...")

    # 1. Fetch data
    print("  [1/3] Fetching data from Google Sheets...")
    raw_data = fetch_comparison_data()

    if not raw_data:
        raise ValueError("No data found in spreadsheet.")

    print(f"       → {len(raw_data)} rows fetched")

    # 2. Parse data
    print("  [2/3] Parsing data...")
    target = target_month or datetime.now().strftime("%Y年%m月")

    report_data = build_financial_report(
        raw_data=raw_data,
        company_name=COMPANY_INFO['name'],
        fiscal_year=COMPANY_INFO['fiscal_year'],
        period=COMPANY_INFO['period'],
        target_month=target,
    )

    print(f"       → {len(report_data.annual_kpis)} KPIs, {len(report_data.pl_items)} P/L items")

    # 3. Generate HTML
    print("  [3/3] Generating HTML report...")

    if output_path is None:
        timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
        output_path = OUTPUT_DIR / f"financial_report_{timestamp}.html"

    output_path.parent.mkdir(parents=True, exist_ok=True)

    generator = HTMLReportGenerator(output_path, report_data)
    generator.generate()

    print(f"\n✅ HTML Report generated: {output_path}")
    print(f"   File size: {output_path.stat().st_size / 1024:.1f} KB")
    print(f"\n💡 Tip: Open in browser and print (Ctrl+P) to save as PDF")

    # Auto open
    if open_after:
        import subprocess
        import platform

        if platform.system() == 'Darwin':  # macOS
            subprocess.run(['open', str(output_path)])
        elif platform.system() == 'Windows':
            subprocess.run(['start', str(output_path)], shell=True)
        else:  # Linux
            subprocess.run(['xdg-open', str(output_path)])

    return output_path


def generate_pdf_report(
    target_month: str = None,
    output_path: Path = None,
    open_after: bool = False,
) -> Path:
    """Generate PDF report (may have font issues)"""
    from .pdf.generator import ReportGenerator

    print("📊 Financial Report Generation (PDF)...")
    print("⚠️  Note: PDF may have font issues for Japanese characters")

    # 1. Fetch data
    print("  [1/4] Fetching data from Google Sheets...")
    raw_data = fetch_comparison_data()

    if not raw_data:
        raise ValueError("No data found in spreadsheet.")

    print(f"       → {len(raw_data)} rows fetched")

    # 2. Parse data
    print("  [2/4] Parsing data...")
    target = target_month or datetime.now().strftime("%Y年%m月")

    report_data = build_financial_report(
        raw_data=raw_data,
        company_name=COMPANY_INFO['name'],
        fiscal_year=COMPANY_INFO['fiscal_year'],
        period=COMPANY_INFO['period'],
        target_month=target,
    )

    print(f"       → {len(report_data.annual_kpis)} KPIs, {len(report_data.pl_items)} P/L items")

    # 3. Generate PDF
    print("  [3/4] Generating PDF...")

    if output_path is None:
        timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
        output_path = OUTPUT_DIR / f"financial_report_{timestamp}.pdf"

    output_path.parent.mkdir(parents=True, exist_ok=True)

    generator = ReportGenerator(output_path, report_data)
    generator.generate()

    print(f"       → {generator.total_pages} pages generated")

    # 4. Done
    print("  [4/4] Saved!")
    print(f"\n✅ PDF generated: {output_path}")
    print(f"   File size: {output_path.stat().st_size / 1024:.1f} KB")

    # Auto open
    if open_after:
        import subprocess
        import platform

        if platform.system() == 'Darwin':  # macOS
            subprocess.run(['open', str(output_path)])
        elif platform.system() == 'Windows':
            subprocess.run(['start', str(output_path)], shell=True)
        else:  # Linux
            subprocess.run(['xdg-open', str(output_path)])

    return output_path


def list_sheets():
    """List spreadsheet sheets"""
    print("📋 Spreadsheet Sheets:")
    sheets = sheets_client.get_all_sheets()
    for sheet in sheets:
        print(f"   - {sheet['title']} (gid: {sheet['sheet_id']})")


def main():
    parser = argparse.ArgumentParser(
        description="Money Forward Style Financial Report Generator"
    )

    subparsers = parser.add_subparsers(dest='command', help='Commands')

    # html command (recommended)
    html_parser = subparsers.add_parser('html', help='Generate HTML report (recommended)')
    html_parser.add_argument(
        '--month', '-m',
        help='Target month (e.g., 2025-10)',
        default=None
    )
    html_parser.add_argument(
        '--output', '-o',
        type=Path,
        help='Output file path',
        default=None
    )
    html_parser.add_argument(
        '--open',
        action='store_true',
        help='Open after generation'
    )

    # pdf command
    pdf_parser = subparsers.add_parser('pdf', help='Generate PDF report')
    pdf_parser.add_argument(
        '--month', '-m',
        help='Target month (e.g., 2025-10)',
        default=None
    )
    pdf_parser.add_argument(
        '--output', '-o',
        type=Path,
        help='Output file path',
        default=None
    )
    pdf_parser.add_argument(
        '--open',
        action='store_true',
        help='Open after generation'
    )

    # list command
    subparsers.add_parser('list', help='List sheets')

    # generate command (backward compatibility, defaults to html)
    gen_parser = subparsers.add_parser('generate', help='Generate report (defaults to HTML)')
    gen_parser.add_argument(
        '--format', '-f',
        choices=['html', 'pdf'],
        default='html',
        help='Output format (default: html)'
    )
    gen_parser.add_argument(
        '--month', '-m',
        help='Target month (e.g., 2025-10)',
        default=None
    )
    gen_parser.add_argument(
        '--output', '-o',
        type=Path,
        help='Output file path',
        default=None
    )
    gen_parser.add_argument(
        '--open',
        action='store_true',
        help='Open after generation'
    )

    args = parser.parse_args()

    if args.command == 'html':
        generate_html_report(
            target_month=args.month,
            output_path=args.output,
            open_after=args.open,
        )
    elif args.command == 'pdf':
        generate_pdf_report(
            target_month=args.month,
            output_path=args.output,
            open_after=args.open,
        )
    elif args.command == 'generate':
        if args.format == 'pdf':
            generate_pdf_report(
                target_month=args.month,
                output_path=args.output,
                open_after=args.open,
            )
        else:
            generate_html_report(
                target_month=args.month,
                output_path=args.output,
                open_after=args.open,
            )
    elif args.command == 'list':
        list_sheets()
    else:
        parser.print_help()
        print("\n📌 Recommended: python -m src.main html")


if __name__ == "__main__":
    main()
