# -*- coding: utf-8 -*-
"""TBH Service AS - automatiseringsforslag. 16:9 landscape PDF."""
from reportlab.lib.pagesizes import A4, landscape
from reportlab.lib.units import mm
from reportlab.lib.colors import HexColor, white
from reportlab.lib.styles import ParagraphStyle
from reportlab.lib.enums import TA_LEFT
from reportlab.pdfgen import canvas
from PIL import Image

W, H = landscape(A4)  # 842 x 595 pt
NAVY = HexColor("#1a2332")
NAVY2 = HexColor("#232f45")
AMBER = HexColor("#f59e0b")
AMBER_D = HexColor("#b45309")
GREY = HexColor("#5b6472")
LGREY = HexColor("#eef1f6")
BLUE = HexColor("#2563eb")

ASSETS = "C:/Users/joner/tbh-service-prosjekt/assets/"
CHARTS = "C:/Users/joner/tbh-service-prosjekt/charts/"
OUT = "C:/Users/joner/tbh-service-prosjekt/TBH-Service-Automatiseringsforslag.pdf"

def st(name, size, color=white, bold=False, leading=None):
    return ParagraphStyle(name, fontName="Helvetica-Bold" if bold else "Helvetica",
                          fontSize=size, textColor=color,
                          leading=leading or size * 1.35, alignment=TA_LEFT)

c = canvas.Canvas(OUT, pagesize=(W, H))
c.setTitle("Automatisering for TBH Service AS - forslag og pilotplan")
c.setAuthor("TBH Service AS - Automatiseringsforslag")

def bg(color=NAVY):
    c.setFillColor(color)
    c.rect(0, 0, W, H, stroke=0, fill=1)

def amber_bar(x, y, w=70, h=4):
    c.setFillColor(AMBER)
    c.rect(x, y, w, h, stroke=0, fill=1)

def footer(n, dark=False):
    c.setFillColor(HexColor("#9aa4b2") if dark else HexColor("#7d8794"))
    c.setFont("Helvetica", 8.5)
    c.drawString(40, 22, "TBH Service AS · Automatiseringsforslag · Illustrative tall er ikke faktiske resultater")
    c.drawRightString(W - 40, 22, str(n))

def para(text, x, y_top, width, style):
    from reportlab.platypus import Paragraph
    p = Paragraph(text, style)
    w, h = p.wrap(width, H)
    p.drawOn(c, x, y_top - h)
    return h

def cover_image(path, x, y, w, h):
    """Draw image cropped to fill box (cover)."""
    im = Image.open(path)
    iw, ih = im.size
    scale = max(w / iw, h / ih)
    nw, nh = iw * scale, ih * scale
    cx, cy = (nw - w) / 2 / scale, (nh - h) / 2 / scale
    c.saveState()
    p = c.beginPath()
    p.rect(x, y, w, h)
    c.clipPath(p, stroke=0)
    c.drawImage(path, x - cx * scale, y - cy * scale, nw, nh, mask='auto')
    c.restoreState()

# ---------------------------------------------------------------- PAGE 1: COVER
bg()
cover_image(ASSETS + "cover.jpg", W - 380, 0, 380, H)
# gradient-ish overlay strip on image edge
c.setFillColor(NAVY)
c.rect(W - 396, 0, 16, H, stroke=0, fill=1)

amber_bar(60, H - 150)
para("Forslag til digital assistent<br/>for TBH Service AS", 58, H - 170, 420, st("h1", 30, white, True, 38))
para("Facebook-innhold, priskalkyle på oppdrag og administrative rutiner –<br/>automatisert med en digital assistent, med menneskelig godkjenning.",
     60, H - 300, 400, st("sub", 13, HexColor("#c9d1dc")))

c.setFillColor(AMBER); c.setFont("Helvetica-Bold", 11)
c.drawString(60, H - 360, "MOLDE · KRISTIANSUND · NORDMØRE")
c.setFillColor(HexColor("#aab3c0")); c.setFont("Helvetica", 10.5)
c.drawString(60, H - 380, "Tømrer- og rørleggertjenester | tbhservice.no | Sentralt godkjent")
c.setFillColor(HexColor("#8892a0")); c.setFont("Helvetica", 9)
c.drawString(60, 46, "August 2026 · Uforpliktende forslag")
footer(1)

# ---------------------------------------------------------------- helper: light page header
def light_header(tittel, undertittel):
    bg(white)
    c.setFillColor(NAVY)
    c.rect(0, H - 64, W, 64, stroke=0, fill=1)
    amber_bar(40, H - 12, 50, 4)
    c.setFillColor(white); c.setFont("Helvetica-Bold", 20)
    c.drawString(40, H - 42, tittel)
    if undertittel:
        c.setFillColor(HexColor("#aeb8c6")); c.setFont("Helvetica", 11)
        c.drawRightString(W - 40, H - 40, undertittel)

def card(x, y, w, h, title=None, accent=AMBER):
    c.setFillColor(LGREY)
    c.roundRect(x, y, w, h, 8, stroke=0, fill=1)
    if title:
        c.setFillColor(accent)
        c.rect(x, y + h - 26, 4, 18, stroke=0, fill=1)
        c.setFillColor(NAVY); c.setFont("Helvetica-Bold", 11)
        c.drawString(x + 14, y + h - 21, title)

# ---------------------------------------------------------------- PAGE 2: DAGENS SITUASJON
c.showPage()
light_header("Dagens situasjon", "Basert på offentlig informasjon fra tbhservice.no")
colw = (W - 100) / 2

card(40, H - 330, colw, 240, "Det som allerede fungerer godt")
from reportlab.platypus import Paragraph
yy = H - 118
for t in [
    "<b>Klar posisjonering:</b> én leverandør for både tømrer og rørlegger i Molde, Kristiansund og Nordmøre",
    "<b>Sentralt godkjent</b> foretak – viktig konkurransefortrinn mot private og borettslag",
    "<b>Bred tjenestekatalog:</b> nybygg, rehabilitering, bad, kjøkken, terrasser, vann/avløp og service",
    "<b>Facebook-side og enkel kontaktflyt</b> med telefon og skjema på nettstedet",
]:
    p = Paragraph("•&nbsp;&nbsp;" + t, st("li", 10.5, NAVY, False, 15))
    w_, h_ = p.wrap(colw - 36, 200)
    p.drawOn(c, 58, yy - h_)
    yy -= h_ + 10

card(40 + colw + 20, H - 330, colw, 240, "Mulighetene vi ser")
yy = H - 118
for t in [
    "<b>Ujevn synlighet på Facebook</b> – innhold kommer når hverdagen tillater det, ikke etter plan",
    "<b>Pristilbud beregnes manuelt</b> – tidkrevende, og svartiden avgjør ofte hvem som vinner oppdraget",
    "<b>Etterspørselssignalene ligger urørt</b> – henvendelser, FAQ-spørsmål og sesongmønster samles ikke inn",
    "<b>Ingen rapportgrunnlag</b> – hvilke tjenester og annonser som faktisk gir oppdrag, er ukjent",
]:
    p = Paragraph("•&nbsp;&nbsp;" + t, st("li", 10.5, NAVY, False, 15))
    w_, h_ = p.wrap(colw - 36, 200)
    p.drawOn(c, 58 + colw + 20, yy - h_)
    yy -= h_ + 10

amber_bar(40, H - 370, 60, 4)
para("Kjerneideen: agenten tar rutinearbeidet – du beholder kontrollen. Alt kundeorientert innhold stopper hos deg til godkjenning før noe publiseres eller sendes.",
     40, H - 382, W - 80, st("idea", 12.5, GREY))

footer(2, dark=True)
c.showPage()

# ---------------------------------------------------------------- PAGE 3: MULIGHETSOVERSIKT
light_header("Seks muligheter – tre nivåer av autonomi", "Godkjenningsgrensene følger prinsippet om minst mulig rettighet")

levels = [
    ("AUTOMATISK (skrivebeskyttet)", AMBER_D, [
        ("Overvåke Facebook-siden og anmeldelser", "Varsel ved nye meldinger, anmeldelser eller nevnelser av TBH"),
        ("Samle etterspørselssignaler", "Logge hva folk spør om – bad, lekkasje, terrasse – som grunnlag for innhold"),
        ("Ukentlig statusrapport", "Én kort e-post: nye henvendelser, innlegg publisert, hva som skjer denne uken"),
    ]),
    ("UTKAST – GODKJENNING KREVES", BLUE, [
        ("Facebook-innholdspakke hver uke", "3–4 ferdige innlegg med bilde, tekst, hashtags og publiseringsdato – du trykker godkjenn"),
        ("Priskalkyle på oppdrag", "Agenten setter opp kalkyle fra timepris, materiallister og maler – du verifiserer og sender"),
        ("Svarforslag på henvendelser", "Kladd til svar på meldinger og FAQ-spørsmål, tilpasset din tone"),
    ]),
    ("IKKE AUTONOMT I FØRSTE OMGANG", GREY, [
        ("Publisering uten godkjenning", "Skrus på først når kvaliteten er bevart over tid"),
        ("Endring av priser eller tilbud", "Alltid en menneskelig beslutning"),
        ("Kundedata og regnskap", "Leses aldri uten eksplisitt samtykke; skrives aldri automatisk"),
    ]),
]
cw = (W - 110) / 3
x = 40
for ltitle, lcolor, items in levels:
    card(x, 90, cw, H - 190, None, lcolor)
    c.setFillColor(lcolor)
    c.roundRect(x, H - 128, cw, 32, 8, stroke=0, fill=1)
    c.rect(x, H - 128, cw, 16, stroke=0, fill=1)
    c.setFillColor(white); c.setFont("Helvetica-Bold", 9.5)
    c.drawCentredString(x + cw / 2, H - 117, ltitle)
    yy = H - 155
    for it, desc in items:
        c.setFillColor(NAVY); c.setFont("Helvetica-Bold", 10)
        h1 = para(it, x + 14, yy, cw - 28, st("it", 10, NAVY, True, 13))
        yy -= h1 + 2
        h2 = para(desc, x + 14, yy, cw - 28, st("id", 9, GREY, False, 12))
        yy -= h2 + 12
    x += cw + 25

footer(3, dark=True)
c.showPage()

# ---------------------------------------------------------------- PAGE 4: FACEBOOK CONTENT MASKINEN
light_header("Facebook-innholdsmaskinen", "Eksempel: hvordan én jobb blir fire innlegg")

steps = [
    ("1", "Du registrerer jobben", "Ett bilde fra byggplassen + to setninger: «Bad totalrenovert på Øysand»."),
    ("2", "Agenten lager utkast", "Tekst, hashtags, bildeutvalg og publiseringsdato – i din tone, på norsk."),
    ("3", "Du godkjenner i appen", "God/Bruk som den er/Avvis. Ingen postes uten ditt trykk."),
    ("4", "Agenten planlegger og måler", "Poster til rett tid og oppsummerer rekkevidde, klikk og henvendelser."),
]
sw = (W - 130) / 4
x = 45
for num, t, d in steps:
    card(x, H - 250, sw, 165)
    c.setFillColor(AMBER)
    c.circle(x + 24, H - 108, 14, stroke=0, fill=1)
    c.setFillColor(white); c.setFont("Helvetica-Bold", 13)
    c.drawCentredString(x + 24, H - 112, num)
    h = para(t, x + 14, H - 140, sw - 28, st("st", 10.5, NAVY, True, 13))
    para(d, x + 14, H - 142 - h, sw - 28, st("sd", 9, GREY, False, 12))
    x += sw + 27

c.setFillColor(NAVY); c.setFont("Helvetica-Bold", 13)
c.drawString(45, H - 290, "Fire eksempler på innlegg agenten kan foreslå:")
examples = [
    ("Før/etter – baderom", "«Fra 1978-bad til helt nytt på to uker. Se transformasjonen 👇»\nBilde: dine egne før/etter-foto. CTA: «Book gratis befaring»."),
    ("Tips fra rørleggeren", "«Tre tegn på at vannledningen bør skiftes før vinteren.»\nPosisjonerer dere som eksperter – gir organisk rekkevidde."),
    ("Omdømme", "«Takk for tilliten! ⭐⭐⭐⭐⭐ Enda et fornøyd kundeforhold i Kristiansund.»\nBygger sosialt bevis lokalt."),
    ("Sesong", "«August er siste sjanse å få badet ferdig før høsten. Nå booker vi inn september.»\nKonverterer når etterspørselen er der."),
]
ex_w = (W - 110) / 2
positions = [(45, H - 430), (45 + ex_w + 20, H - 430), (45, H - 545), (45 + ex_w + 20, H - 545)]
for (t, d), (px, py) in zip(examples, positions):
    card(px, py, ex_w, 105)
    c.setFillColor(AMBER_D); c.setFont("Helvetica-Bold", 10.5)
    c.drawString(px + 14, py + 82, t)
    para(d.replace("\n", "<br/>"), px + 14, py + 76, ex_w - 28, st("ed", 9, GREY, False, 12.5))

footer(4, dark=True)
c.showPage()

# ---------------------------------------------------------------- PAGE 5: PRISKALKYLE
light_header("Priskalkyle på oppdrag – konsistent og rask", "Fra befaring notater til dokumentert tilbud i minutter, ikke timer")

flow = [
    ("Befaringsnotater", "Diktér eller skriv løst: areal, omfang, valg av materialer, ønsket tidsramme."),
    ("Agenten bygger kalkyle", "Timepriser × estimerte timer + materialliste fra maler + tilslag + MVA – alt sporbar."),
    ("Du justerer og godkjenner", "Endre antakelser, legg på risikopost, sett sluttp pris."),
    ("Tilbud på plass samme dag", "PDF-tilbud i deres mal sendes – mens konkurrentene fortsatt regner."),
]
fw = (W - 110) / 4
x = 45
arrow_y = H - 205
for i, (t, d) in enumerate(flow):
    card(x, H - 250, fw, 165)
    c.setFillColor(NAVY); c.setFont("Helvetica-Bold", 10.5)
    h = para(t, x + 14, H - 100, fw - 28, st("ft", 10.5, NAVY, True, 13))
    para(d, x + 14, H - 102 - h, fw - 28, st("fd", 9, GREY, False, 12))
    if i < 3:
        c.setFillColor(AMBER)
        c.setFont("Helvetica-Bold", 18)
        c.drawString(x + fw + 4, arrow_y, "→")
    x += fw + 27

card(45, H - 480, (W - 110) * 0.55, 200, "Hvorfor dette vinner oppdrag")
yy = H - 305
for t in [
    "Svarfrist er ofte avgjørende: kunden velger gjerne den som <b>svarer først med et gjennomarbeidet tilbud</b>",
    "<b>Ingen glemte poster</b> – kalkylen sjekker mot standard maler for bad, terrasse og serviceoppdrag",
    "<b>Alt dokumenteres</b> – grunnlaget ligges til rette for etterkalkyle, slik at neste tilbud blir enda bedre",
    "Agenten kan også <b>følge opp</b>: minne om u besvarte tilbud etter en uke (utkast, du sender)",
]:
    p = Paragraph("•&nbsp;&nbsp;" + t, st("wl", 10.5, NAVY, False, 15))
    w_, h_ = p.wrap((W - 110) * 0.55 - 36, 180)
    p.drawOn(c, 62, yy - h_)
    yy -= h_ + 10

cover_image(ASSETS + "plumber.png", W - 45 - (W - 110) * 0.38, H - 480, (W - 110) * 0.38, 200)
c.setFillColor(HexColor("#ffffff")); c.setFont("Helvetica", 8)
c.drawString(W - 45 - (W - 110) * 0.38 + 6, H - 492, "Illustrasjonsbilde (AI-generert)")

footer(5, dark=True)
c.showPage()

# ---------------------------------------------------------------- PAGE 6: GRAFER
light_header("Effekten av automatisert markedsføring", "Illustrative tall basert på typiske forhold i små håndverksbedrifter – ikke faktiske resultater")

c.drawImage(CHARTS + "chart_timer.png", 45, H - 370, 500, 300, mask='auto')
c.drawImage(CHARTS + "chart_innlegg.png", 590, H - 370, 500, 300, mask='auto')

card(45, 70, (W - 110), 130)
c.setFillColor(NAVY); c.setFont("Helvetica-Bold", 12)
c.drawString(65, 168, "Hva grafene viser")
para("<b>Venstre:</b> Rutinetimer per måned faller fra ca. 20 til ca. 7 – frigjort tid til håndverk og kundeoppfølging. "
     "<b>Høyre:</b> Fra sporadiske innlegg til fast kalender med 8–9 synlige innlegg i måneden. "
     "Flere synlige innlegg øker sannsynligheten for at TBH er «toppen av sinnet» akkurat når kunden trenger rørlegger eller tømrer. "
     "<b>Merk:</b> Alle tall er illustrative – vi etablerer reell målestokk i pilotens første uker.",
     65, 158, W - 160, st("exp", 10, GREY, False, 14))

footer(6, dark=True)
c.showPage()

# ---------------------------------------------------------------- PAGE 7: PILOTPLAN
light_header("Pilotplan på 30 dager", "Lav terskel, målbar effekt, full kontroll")

weeks = [
    ("UKE 1", "Oppsett og kartlegging", ["Tilgang: Facebook-side (rolle: redaktør), e-post", "Kildekart: tjenester, prismaler, bilder", "Innholdsbank: 10–15 gode bilder", "Basemåling: nåværende aktivitet"]),
    ("UKE 2", "Overvåking på plass", ["Automatisk varsel ved meldinger/anmeldelser", "Spørsmålslogg begynner å samles", "Første ukentlige statusrapport", "Kalender med 2 innlegg/uke foreslått"]),
    ("UKE 3", "Full innholdsrutine", ["3–4 innleggsutkast per uke til godkjenning", "Første priskalkyle testet på ekte oppdrag", "Svarforslag på henvendelser", "Justering av tone og frekvens"]),
    ("UKE 4", "Måling og beslutning", ["Oppsummering: tid brukt vs. sparing", "Rekkevidde, klikk og henvendelser", "Beslutning: videre drift og omfang", "Eventuell utvidelse: Instagram, nyhetsbrev"]),
]
ww = (W - 130) / 4
x = 45
for tag, t, items in weeks:
    card(x, H - 420, ww, 350)
    c.setFillColor(AMBER)
    c.rect(x, H - 115, ww, 30, stroke=0, fill=1)
    c.setFillColor(white); c.setFont("Helvetica-Bold", 11)
    c.drawCentredString(x + ww / 2, H - 106, tag)
    c.setFillColor(NAVY); c.setFont("Helvetica-Bold", 10.5)
    h = para(t, x + 12, H - 135, ww - 24, st("wt", 10.5, NAVY, True, 13))
    yy = H - 137 - h
    for it in items:
        p = Paragraph("·&nbsp;&nbsp;" + it, st("wi", 8.5, GREY, False, 12))
        w_, h_ = p.wrap(ww - 26, 80)
        p.drawOn(c, x + 12, yy - h_)
        yy -= h_ + 6
    x += ww + 27

amber_bar(45, 95, 60, 4)
para("<b>Suksesskriterier for piloten:</b> sparret admin-tid (timer/mnd) · antall publiserte innlegg med godkjenning · henvendelser via Facebook · svarfrist på tilbud (dager).",
     45, 82, W - 110, st("succ", 10.5, GREY, False, 14))

footer(7, dark=True)

# ---------------------------------------------------------------- PAGE 8: TITTEL + KONTAKT
bg()
cover_image(ASSETS + "bad.jpg", 0, 0, W, H)
c.setFillColor(HexColor("#1a2332"))
c.setFillAlpha(0.88)
c.rect(0, 0, W, H, stroke=0, fill=1)
c.setFillAlpha(1)

amber_bar(60, H - 130)
c.setFillColor(white); c.setFont("Helvetica-Bold", 26)
c.drawString(60, H - 175, "Neste steg")
para("Vi starter smått: én uke med overvåking og to innleggsutkast – helt uten forpliktelse.<br/>"
     "Viser det resultater, skalerer vi opp. Alt kundeorientert innhold stopper hos dere før publisering.",
     60, H - 195, 520, st("n1", 13, HexColor("#dbe2ea"), False, 19))

cards_data = [
    ("Steg 1 · Oppstartsmøte", "30 minutter – vi går gjennom tjenester, bilder og tone."),
    ("Steg 2 · Tilgang", "Facebook-redaktør-rolle og e-post. Minst mulig rettighet."),
    ("Steg 3 · Pilot uke 1", "Overvåking på plass, første utkast klar innen 48 timer."),
]
cw2 = (W - 160) / 3
x = 60
for t, d in cards_data:
    c.setFillColor(HexColor("#232f45"))
    c.roundRect(x, 150, cw2, 110, 8, stroke=0, fill=1)
    c.setFillColor(AMBER)
    c.rect(x, 244, 4, 14, stroke=0, fill=1)
    c.setFillColor(white); c.setFont("Helvetica-Bold", 11)
    c.drawString(x + 16, 232, t)
    para(d, x + 16, 224, cw2 - 32, st("nc", 9.5, HexColor("#aab3c0"), False, 13))
    x += cw2 + 20

c.setFillColor(HexColor("#8892a0")); c.setFont("Helvetica", 9)
c.drawString(60, 90, "Fotnoter: Faktainformasjon om TBH Service AS er hentet fra tbhservice.no (august 2026). Grafer og tall er illustrative eksempler, ikke faktiske resultater.")
c.drawString(60, 74, "AI-genererte illustrasjoner er merket. Ekte bilder fra tbhservice.no er brukt på forsiden og bakside.")
footer(8)

c.showPage()
c.save()
print("PDF written:", OUT)
