import os
from datetime import datetime

import pandas as pd
from flask import current_app
from reportlab.lib import colors
from reportlab.lib.pagesizes import A4
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.lib.units import cm
from reportlab.platypus import Paragraph, SimpleDocTemplate, Spacer, Table, TableStyle


def export_dir():
    path = os.path.join(current_app.root_path, "..", "exports")
    os.makedirs(path, exist_ok=True)
    return path


def money(value):
    return "Rp {:,.0f}".format(float(value or 0)).replace(",", ".")


def percent(value):
    return f"{float(value or 0):.2f}%"


def base_rows(analysis, result):
    return [
        ("Nama Debitur", analysis.nama_debitur),
        ("NIK", analysis.nik),
        ("Alamat", analysis.alamat),
        ("Nomor HP", analysis.nomor_hp),
        ("Jenis Usaha", analysis.jenis_usaha),
        ("Tanggal Analisis", analysis.tanggal_analisis.strftime("%d/%m/%Y")),
        ("Total Aset", money(result["total_aset"])),
        ("Total Kewajiban", money(result["total_kewajiban"])),
        ("Modal / Net Worth", money(result["modal"])),
        ("Laba Bersih", money(result["laba_bersih"])),
        ("Cash Flow Bersih", money(result["cash_flow_bersih"])),
        ("Current Ratio", result["current_ratio"]),
        ("Debt Ratio", percent(result["debt_ratio"])),
        ("DER", result["der"]),
        ("RPC", percent(result["rpc"])),
        ("Status RPC", result["rpc_status"]),
        ("Skor 5C", f"{result['total_5c']} / 25 ({percent(result['percentage_5c'])})"),
        ("Kesimpulan 5C", result["conclusion_5c"]),
        ("Coverage Agunan", percent(result["coverage_agunan"])),
        ("LTV", percent(result["ltv"])),
        ("Angsuran Bulanan", money(result["angsuran_bulanan"])),
        ("Rekomendasi", result["recommendation"]),
        ("Rekomendasi Plafon", money(result["rekomendasi_plafon"])),
        ("Alasan", " ".join(result["recommendation_reasons"])),
    ]


def build_pdf(analysis, result):
    filename = f"sakm_{analysis.id}_{datetime.now().strftime('%Y%m%d%H%M%S')}.pdf"
    path = os.path.join(export_dir(), filename)
    doc = SimpleDocTemplate(path, pagesize=A4, rightMargin=1.2 * cm, leftMargin=1.2 * cm, topMargin=1.2 * cm, bottomMargin=1.2 * cm)
    styles = getSampleStyleSheet()
    story = [
        Paragraph("SAKM - Sistem Analisis Kredit Mikro", styles["Title"]),
        Paragraph("Laporan Analisis Kredit", styles["Heading2"]),
        Spacer(1, 0.4 * cm),
    ]
    data = [["Komponen", "Nilai"]] + [[label, str(value)] for label, value in base_rows(analysis, result)]
    table = Table(data, colWidths=[6 * cm, 11 * cm])
    table.setStyle(TableStyle([
        ("BACKGROUND", (0, 0), (-1, 0), colors.HexColor("#0d6efd")),
        ("TEXTCOLOR", (0, 0), (-1, 0), colors.white),
        ("GRID", (0, 0), (-1, -1), 0.25, colors.HexColor("#ced4da")),
        ("FONTNAME", (0, 0), (-1, 0), "Helvetica-Bold"),
        ("VALIGN", (0, 0), (-1, -1), "TOP"),
        ("ROWBACKGROUNDS", (0, 1), (-1, -1), [colors.white, colors.HexColor("#f8f9fa")]),
        ("PADDING", (0, 0), (-1, -1), 7),
    ]))
    story.append(table)
    doc.build(story)
    return path


def build_excel(analysis, result):
    filename = f"sakm_{analysis.id}_{datetime.now().strftime('%Y%m%d%H%M%S')}.xlsx"
    path = os.path.join(export_dir(), filename)
    df = pd.DataFrame(base_rows(analysis, result), columns=["Komponen", "Nilai"])
    inputs = pd.DataFrame([{
        column.name: getattr(analysis, column.name)
        for column in analysis.__table__.columns
        if column.name not in ["created_at", "updated_at"]
    }])
    outputs = pd.DataFrame([result])
    with pd.ExcelWriter(path, engine="openpyxl") as writer:
        df.to_excel(writer, sheet_name="Laporan", index=False)
        inputs.to_excel(writer, sheet_name="Input", index=False)
        outputs.to_excel(writer, sheet_name="Hasil Analisis", index=False)
        for sheet in writer.sheets.values():
            for column_cells in sheet.columns:
                max_length = max(len(str(cell.value or "")) for cell in column_cells)
                sheet.column_dimensions[column_cells[0].column_letter].width = min(max_length + 3, 45)
    return path

