# -*- coding: utf-8 -*-
"""Generira 'BIKE CROSS - Prilog 1 - Popis biciklistickih ruta.pdf' (zaseban dokument):
naslovnica (pregledna karta + tablica) + stranica po ruti s kartografskim prikazom."""
import json, os
from reportlab.lib.pagesizes import A4
from reportlab.lib.units import mm
from reportlab.lib import colors
from reportlab.lib.styles import ParagraphStyle
from reportlab.platypus import (SimpleDocTemplate, Paragraph, Table, TableStyle,
                                HRFlowable, Spacer, Image, PageBreak)
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont

BASE = os.path.dirname(os.path.abspath(__file__))
F = "/System/Library/Fonts/Supplemental/"
pdfmetrics.registerFont(TTFont("Arial", F + "Arial.ttf"))
pdfmetrics.registerFont(TTFont("Arial-Bold", F + "Arial Bold.ttf"))
pdfmetrics.registerFont(TTFont("Arial-Italic", F + "Arial Italic.ttf"))
pdfmetrics.registerFontFamily("Arial", normal="Arial", bold="Arial-Bold", italic="Arial-Italic")

NAVY = colors.HexColor("#1a3e5c"); ACCENT = colors.HexColor("#c8102e")
GREY = colors.HexColor("#555555"); LIGHT = colors.HexColor("#eef2f6")
LINE = colors.HexColor("#c9d4de")
COLORS = {"R1": "#d62728", "R2": "#2ca02c", "R3": "#1f77b4", "R4": "#ff7f0e",
          "R5": "#9467bd", "R6": "#0e8585", "R7": "#8c564b", "R8": "#d63384"}
W = A4[0] - 30 * mm

S = dict(
    title=ParagraphStyle("t", fontName="Arial-Bold", fontSize=17, leading=21, textColor=NAVY, spaceAfter=2),
    sub=ParagraphStyle("s", fontName="Arial", fontSize=11, leading=14, textColor=GREY, spaceAfter=6),
    body=ParagraphStyle("b", fontName="Arial", fontSize=9.3, leading=12.8, spaceAfter=5),
    it=ParagraphStyle("i", fontName="Arial-Italic", fontSize=8.8, leading=12, textColor=GREY, spaceAfter=4),
    rh=ParagraphStyle("rh", fontName="Arial-Bold", fontSize=13.5, leading=17, textColor=NAVY, spaceAfter=2),
    ri=ParagraphStyle("ri", fontName="Arial", fontSize=10, leading=13.5, textColor=GREY, spaceAfter=6),
    cell=ParagraphStyle("c", fontName="Arial", fontSize=8.4, leading=11),
    cellB=ParagraphStyle("cb", fontName="Arial-Bold", fontSize=8.4, leading=11, textColor=NAVY),
    cellH=ParagraphStyle("ch", fontName="Arial-Bold", fontSize=8.6, leading=11, textColor=colors.white),
)

cfg = json.load(open(os.path.join(BASE, "rute.json"), encoding="utf-8"))
stats = {s["id"]: s for s in json.load(open(os.path.join(BASE, "stats.json"), encoding="utf-8"))}

def footer(canvas, doc):
    canvas.saveState()
    canvas.setStrokeColor(LINE); canvas.setLineWidth(0.5)
    canvas.line(15 * mm, 12 * mm, A4[0] - 15 * mm, 12 * mm)
    canvas.setFont("Arial", 7.6); canvas.setFillColor(GREY)
    canvas.drawString(15 * mm, 8 * mm, "BIKE CROSS · Prilog 1: Popis biciklističkih ruta · WebLink · 16.8.2026.")
    canvas.drawRightString(A4[0] - 15 * mm, 8 * mm, f"Stranica {doc.page}")
    canvas.restoreState()

out = "/Users/antonio/Documents/Projects/Weblink/Bike Cross/dokumentacija/pdf/BIKE CROSS - Prilog 1 - Popis biciklistickih ruta.pdf"
doc = SimpleDocTemplate(out, pagesize=A4, leftMargin=15 * mm, rightMargin=15 * mm,
                        topMargin=16 * mm, bottomMargin=18 * mm,
                        title="BIKE CROSS - Prilog 1: Popis biciklističkih ruta",
                        author="WebLink, vl. Antonio Novak")
story = []

# ---- naslovnica ----
story.append(Paragraph("BIKE CROSS — Prilog 1: Popis biciklističkih ruta", S["title"]))
story.append(Paragraph("Sastavni dio projektne dokumentacije v1.0 · WebLink, vl. Antonio Novak · 16.8.2026.", S["sub"]))
story.append(HRFlowable(width="100%", thickness=1.2, color=ACCENT, spaceBefore=1, spaceAfter=8))
story.append(Paragraph(
    "Popis ruta utvrđen je u dogovoru Naručitelja i Isporučitelja provedenom nakon sklapanja Ugovora, u okviru "
    "analize zahtjeva iz točke 1. Troškovnika, sukladno napomeni iz Troškovnika. Trase su digitalizirane na "
    "kartografskoj podlozi (OpenStreetMap) i dostavljaju se Naručitelju na potvrdu (§2.3 projektne dokumentacije); "
    "potvrđene trase postaju Prilog 3. Duljina i uspon utvrđeni su digitalizacijom; težina i podloga utvrđuju se "
    "pri uređivanju sadržaja, a konačni nazivi ruta s odobrenjem tekstova. Popis definira sadržaj verzije 1.0 i "
    "nije trajno ograničenje — nove rute mogu se dodavati i nakon objave ažuriranjem sadržaja.", S["body"]))
story.append(Paragraph(
    "Napomena: pristupni put do lovačkog doma Čambina i sam dom (rute R3 i R5) ucrtani su 15.8.2026. u "
    "OpenStreetMap kao doprinos Isporučitelja. Kartografske podloge tu izmjenu preuzimaju u svojim redovitim "
    "ciklusima osvježavanja, pa put na priloženim kartama može biti privremeno nevidljiv — trasa je ispravna, "
    "a u karti aplikacije put će biti prikazan.", S["it"]))
img = Image(os.path.join(BASE, "img", "pregled.png"), width=W * 0.94, height=W * 0.94 * 1100 / 1600)
img.hAlign = "CENTER"
story.append(img)
story.append(Spacer(1, 5))

hdr = ["Oznaka", "Itinerar (destinacije redom)", "Duljina", "Uspon", "Tip", "Prekogranična"]
data = [[Paragraph(h, S["cellH"]) for h in hdr]]
for r in cfg["rute"]:
    st = stats[r["id"]]
    naz = r["naziv"] + (" *" if r.get("napomena") else "")
    data.append([Paragraph(r["id"], S["cellB"]), Paragraph(naz, S["cell"]),
                 Paragraph(f"{st['duljina_km']} km", S["cell"]), Paragraph(f"{st['uspon_m']} m", S["cell"]),
                 Paragraph("kružna" if r["tip"] == "kruzna" else "linijska", S["cell"]),
                 Paragraph("DA" if r["prekogranicna"] else "NE", S["cell"])])
t = Table(data, colWidths=[W * 0.09, W * 0.49, W * 0.095, W * 0.08, W * 0.095, W * 0.15], repeatRows=1)
t.setStyle(TableStyle([
    ("BACKGROUND", (0, 0), (-1, 0), NAVY),
    ("ROWBACKGROUNDS", (0, 1), (-1, -1), [colors.white, LIGHT]),
    ("GRID", (0, 0), (-1, -1), 0.4, LINE),
    ("VALIGN", (0, 0), (-1, -1), "MIDDLE"),
    ("LEFTPADDING", (0, 0), (-1, -1), 5), ("RIGHTPADDING", (0, 0), (-1, -1), 5),
    ("TOPPADDING", (0, 0), (-1, -1), 3), ("BOTTOMPADDING", (0, 0), (-1, -1), 3),
]))
story.append(t)
story.append(Spacer(1, 4))
story.append(Paragraph("* Itinerar rute R5 dodatno se provjerava s Naručiteljem i konačno potvrđuje potvrdom "
                       "digitalizirane trase. · Ukupno: " +
                       f"{round(sum(s['duljina_km'] for s in stats.values()), 1)} km u 8 ruta. "
                       "Tip rute: kružna (polazište = odredište) ili linijska (različiti). Polazište je na kartama "
                       "označeno tamnoplavom točkom.", S["it"]))

# ---- stranica po ruti ----
for r in cfg["rute"]:
    st = stats[r["id"]]
    story.append(PageBreak())
    story.append(Paragraph(
        f'<font color="{COLORS[r["id"]]}">■</font> {r["id"]} — {r["naziv"]}', S["rh"]))
    info = (f"{st['duljina_km']} km · uspon {st['uspon_m']} m · " +
            ("kružna ruta" if r["tip"] == "kruzna" else "linijska ruta") +
            (" · prelazi u Mađarsku" if r["prekogranicna"] else ""))
    story.append(Paragraph(info, S["ri"]))
    story.append(HRFlowable(width="100%", thickness=0.8, color=ACCENT, spaceBefore=0, spaceAfter=8))
    story.append(Image(os.path.join(BASE, "img", f"{r['id'].lower()}.png"), width=W, height=W * 1000 / 1600))
    story.append(Spacer(1, 6))
    if r.get("napomena"):
        story.append(Paragraph("Napomena: itinerar rute u dodatnoj je provjeri s Naručiteljem.", S["it"]))
    if "cambina" in r["waypoints"]:
        story.append(Paragraph("Napomena: dionica do lovačkog doma Čambina ide putem ucrtanim u OpenStreetMap "
                               "15.8.2026. — na kartografskoj podlozi može biti privremeno nevidljiv do njezina "
                               "osvježenja; trasa je ispravna.", S["it"]))

doc.build(story, onFirstPage=footer, onLaterPages=footer)
print("OK ->", out, f"({os.path.getsize(out)//1024//1024} MB)")
