import json from reportlab.lib.pagesizes import A4 from reportlab.lib import colors from reportlab.lib.styles import getSampleStyleSheet from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle def export_json(payload, path): with open(path, "w", encoding="utf-8") as f: json.dump(payload, f, ensure_ascii=False, indent=2) return path def export_pdf(payload, path): doc = SimpleDocTemplate(path, pagesize=A4) styles = getSampleStyleSheet() story = [] story.append(Paragraph("Car Analysis Advisor Report", styles["Title"])) story.append(Spacer(1, 8)) story.append(Paragraph(f"Region: {payload['pricing']['region']} | Currency: {payload['pricing']['currency']}", styles["Normal"])) story.append(Spacer(1, 8)) story.append(Paragraph(f"Model: {payload['vehicle']['model']} | Color: {payload['vehicle']['color']['name']} ({payload['vehicle']['color']['hex']})", styles["Normal"])) story.append(Spacer(1, 10)) story.append(Paragraph("Issues & Solutions", styles["Heading2"])) data = [["Issue","Solution","Labor (hrs)","Labor","Parts","Line Total"]] for it in payload["pricing"]["items"]: parts_cost = f"{payload['pricing']['currency']} {it['parts_cost']:.2f}" data.append([it["issue"].replace('_',' '), it["solution"], f"{it['labor_hours']:.2f}", f"{payload['pricing']['currency']} {it['labor_cost']:.2f}", parts_cost, f"{payload['pricing']['currency']} {it['line_total']:.2f}"]) table = Table(data, hAlign="LEFT", colWidths=[90,220,70,70,70,80]) table.setStyle(TableStyle([ ('BACKGROUND',(0,0),(-1,0),colors.darkblue), ('TEXTCOLOR',(0,0),(-1,0),colors.whitesmoke), ('GRID',(0,0),(-1,-1),0.25,colors.grey), ('ALIGN',(2,1),(-1,-1),'CENTER') ])) story.append(table) story.append(Spacer(1, 8)) story.append(Paragraph(f"Subtotal: {payload['pricing']['currency']} {payload['pricing']['subtotal']:.2f}", styles["Normal"])) story.append(Paragraph(f"Tax: {payload['pricing']['currency']} {payload['pricing']['tax']:.2f}", styles["Normal"])) story.append(Paragraph(f"Grand Total: {payload['pricing']['currency']} {payload['pricing']['grand_total']:.2f}", styles["Heading3"])) doc.build(story) return path