"""
Export service for generating CSV and PDF for all 3 reports.
"""
import csv
import io
from datetime import date
from typing import Optional, List

from sqlalchemy.orm import Session


def export_payment_methods_csv(
    db: Session,
    merchant_id: int,
    date_from: Optional[date] = None,
    date_to: Optional[date] = None,
    method: Optional[List[str]] = None,
) -> bytes:
    from src.apps.reports.services.payment_methods_service import get_payment_methods_report
    report = get_payment_methods_report(db=db, merchant_id=merchant_id, date_from=date_from, date_to=date_to, method=method)

    output = io.StringIO()
    writer = csv.writer(output)
    writer.writerow(["Method of Payment", "Payments", "Refunds", "Payment Amount", "Refund Amount", "Fees", "Net Settlement"])

    for row in report.rows:
        method_label = row.method.title()
        if row.method == 'card':
            method_label = "Card (Total)"
        writer.writerow([
            method_label, row.payment_count, row.refund_count,
            f"${row.payment_amount:.2f}", f"${row.refund_amount:.2f}",
            f"${row.fees:.2f}", f"${row.net_settlement:.2f}",
        ])
        for sub in row.sub_rows:
            writer.writerow([
                f"  {sub.brand}", sub.payment_count, sub.refund_count,
                f"${sub.payment_amount:.2f}", f"${sub.refund_amount:.2f}",
                f"${sub.fees:.2f}", f"${sub.net_settlement:.2f}",
            ])

    writer.writerow([
        "Total Amount", "", "",
        f"${report.total_payment_amount:.2f}",
        f"${report.total_refund_amount:.2f}",
        "$0.00",
        f"${report.total_net_settlement:.2f}",
    ])
    return output.getvalue().encode("utf-8")


def export_payment_methods_pdf(db: Session, merchant_id: int, merchant, date_from=None, date_to=None, method=None) -> bytes:
    from src.apps.reports.services.payment_methods_service import get_payment_methods_report
    from src.apps.reports.helpers.pdf_generator import report_pdf_generator
    report = get_payment_methods_report(db=db, merchant_id=merchant_id, date_from=date_from, date_to=date_to, method=method)
    return report_pdf_generator.generate_payment_methods_pdf(report_data=report.model_dump(), merchant=merchant)


def export_discounts_csv(
    db: Session,
    merchant_id: int,
    search: Optional[str] = None,
    date_from: Optional[date] = None,
    date_to: Optional[date] = None,
    min_amount: Optional[float] = None,
    max_amount: Optional[float] = None,
) -> bytes:
    from src.apps.reports.services.discounts_service import get_discounts_report
    report = get_discounts_report(db=db, merchant_id=merchant_id, search=search, date_from=date_from, date_to=date_to, min_amount=min_amount, max_amount=max_amount)

    output = io.StringIO()
    writer = csv.writer(output)
    writer.writerow(["Discount Name", "Type", "Applied", "Total Amount"])
    for row in report.rows:
        writer.writerow([row.discount_name, row.discount_type, row.discount_applied, f"${row.discount_amount_total:.2f}"])
    writer.writerow(["Total Amount", "", "", f"${report.total_amount:.2f}"])
    return output.getvalue().encode("utf-8")


def export_discounts_pdf(db, merchant_id, merchant, search=None, date_from=None, date_to=None, min_amount=None, max_amount=None) -> bytes:
    from src.apps.reports.services.discounts_service import get_discounts_report
    from src.apps.reports.helpers.pdf_generator import report_pdf_generator
    report = get_discounts_report(db=db, merchant_id=merchant_id, search=search, date_from=date_from, date_to=date_to, min_amount=min_amount, max_amount=max_amount)
    return report_pdf_generator.generate_discounts_pdf(report_data=report.model_dump(), merchant=merchant)


def export_activity_logs_csv(
    db: Session,
    merchant_id: int,
    search: Optional[str] = None,
    date_from: Optional[date] = None,
    date_to: Optional[date] = None,
    event_category: Optional[List[str]] = None,
) -> bytes:
    from src.apps.reports.services.activity_log_service import get_activity_logs
    report = get_activity_logs(db=db, merchant_id=merchant_id, search=search, date_from=date_from, date_to=date_to, event_category=event_category, page=1, per_page=10000)

    output = io.StringIO()
    writer = csv.writer(output)
    writer.writerow(["Date", "Time", "Category", "Description", "Actor"])
    for group in report.groups:
        for entry in group.entries:
            t = entry.created_at.strftime("%I:%M %p") if entry.created_at else ""
            writer.writerow([group.date, t, entry.event_category, entry.description, entry.actor_name or "System"])
    return output.getvalue().encode("utf-8")


def export_activity_logs_pdf(db, merchant_id, merchant, search=None, date_from=None, date_to=None, event_category=None) -> bytes:
    from src.apps.reports.services.activity_log_service import get_activity_logs
    from src.apps.reports.helpers.pdf_generator import report_pdf_generator
    report = get_activity_logs(db=db, merchant_id=merchant_id, search=search, date_from=date_from, date_to=date_to, event_category=event_category, page=1, per_page=10000)
    return report_pdf_generator.generate_activity_log_pdf(report_data=report.model_dump(), merchant=merchant)
