from flask import Flask, request, send_file, render_template_string
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import A4, landscape, portrait
from reportlab.lib.units import cm
from io import BytesIO
import math
import datetime

app = Flask(__name__)

HTML_FORM = """
<!DOCTYPE html>
<html lang="sv">
<head>
    <meta charset="UTF-8">
    <title>Skapa Kjolmönster</title>
    <style>
        body {
            margin: 0;
            font-family: sans-serif;
            background-color: #f2f2f2;
        }
        .hero {
            position: relative;
            max-width: 900px;
            margin: 0 auto;
        }
        .hero img {
            width: 100%;
            height: auto;
            display: block;
            border-radius: 16px;
        }
        .form-overlay {
            position: absolute;
            top: 40%;
            left: 1%;
            width: 80%;
            max-width: 400px;
            background: rgba(255, 255, 255, 0.85);
            padding: 20px;
            border-radius: 12px;
            box-shadow: 0 0 10px rgba(0,0,0,0.3);
        }
        .form-overlay h1 {
            margin-top: 0;
            font-size: 1.5em;
        }
        .form-overlay label {
            display: block;
            margin-top: 1em;
        }
        .form-overlay input {
            width: 100%;
            padding: 0.5em;
            border-radius: 6px;
            border: 1px solid #ccc;
        }
        .form-overlay button {
            margin-top: 1em;
            padding: 0.6em 1.2em;
            font-size: 1em;
            background-color: #4CAF50;
            color: white;
            border: none;
            border-radius: 6px;
            cursor: pointer;
        }
    </style>
</head>
<body>
    <div class="hero">
        <img src="/static/kjolmonster_bild.png" alt="Kjol med stil">
        <form class="form-overlay" action="/generate" method="post">
            <h1>Generera PDF-mönster</h1>
            <label>Namn på mönster:
                <input type="text" name="pattern_name" required>
            </label>
            <label>Midjeomkrets (cm):
                <input type="number" name="waist" step="0.1" required>
            </label>
            <label>Längd på kjol (cm):
                <input type="number" name="length" step="0.1" required>
            </label>
            <label>Omkrets nertill (cm):
                <input type="number" name="hem" step="0.1" required>
            </label>
            <label>Antal sektioner:
                <input type="number" name="sections" min="1" required>
            </label>
            <button type="submit">Generera PDF</button>
        </form>
    </div>
</body>
</html>
"""

@app.route("/")
def index():
    return render_template_string(HTML_FORM)

def generate_filename(pattern_name):
    date_stamp = datetime.datetime.now().strftime("%Y-%m-%d")
    safe_name = pattern_name.replace(" ", "_")
    return f"{safe_name}_{date_stamp}.pdf"

def draw_first_page(c, pattern_name, waist, length, hem, pages_x, pages_y, total_width, total_height):
    date_stamp = datetime.datetime.now().strftime("%Y-%m-%d")
    c.setFont("Helvetica-Bold", 18)
    c.drawString(2*cm, A4[1]-3*cm, f"Kjolmönster - {pattern_name}")
    c.setFont("Helvetica", 10)
    c.drawString(2*cm, A4[1]-3.8*cm, f"Datum: {date_stamp}")

    c.setFont("Helvetica", 12)
    text = c.beginText(2*cm, A4[1]-5.3*cm)
    text.setLeading(14)
    text.textLines([
        f"Midjeomkrets: {waist:.1f} cm",
        f"Längd på kjol: {length:.1f} cm",
        f"Omkrets nertill: {hem:.1f} cm",
        "",
        "Detta mönster är utspritt över flera A4-sidor.",
        "- Klipp längs de prickade linjerna.",
        "- Använd de ljusgrå överlappande remsorna för att tejpa/limma ihop sidorna.",
        "- Använd markeringskryssen i hörnen för exakt placering.",
        "",
        "Lycka till med sömnaden!"
    ])
    c.drawText(text)

    cell_size = 1.2 * cm
    top = A4[1] - 13.5*cm
    left = 2*cm
    c.setFont("Helvetica", 10)
    c.drawString(left, top + 1*cm, "Sidlayout (översikt):")
    for row in range(pages_y):
        for col in range(pages_x):
            x = left + col * cell_size
            y = top - row * cell_size
            c.rect(x, y, cell_size, cell_size)
            c.drawCentredString(x + cell_size/2, y + cell_size/2 - 4, f"{row+1}-{col+1}")

def draw_pattern_page(c, pattern_name, row, col, pages_x, pages_y, waist, length, hem, total_width, total_height, angle):
    inner_radius = waist / (2 * math.pi)
    outer_radius = inner_radius + length

    offset_x_cm = col * 21.0
    offset_y_cm = (pages_y - row - 1) * 29.7
    c.saveState()
    c.translate(-offset_x_cm * cm, -offset_y_cm * cm)
    center_x = total_width / 2
    center_y = total_height / 2
    c.translate(center_x * cm, center_y * cm)
    c.rotate(90)
    c.setLineWidth(0.3)
    c.setStrokeColorRGB(0, 0, 0)
    c.arc(-outer_radius*cm, -outer_radius*cm, outer_radius*cm, outer_radius*cm, 0, angle)
    c.arc(-inner_radius*cm, -inner_radius*cm, inner_radius*cm, inner_radius*cm, 0, angle)
    c.line(inner_radius*cm, 0, outer_radius*cm, 0)
    x1 = inner_radius * math.cos(math.radians(angle))
    y1 = inner_radius * math.sin(math.radians(angle))
    x2 = outer_radius * math.cos(math.radians(angle))
    y2 = outer_radius * math.sin(math.radians(angle))
    c.line(x1*cm, y1*cm, x2*cm, y2*cm)
    c.restoreState()

    # Liten sidhuvudtext
    c.setFont("Helvetica-Bold", 9)
    c.setFillColorRGB(0, 0, 0)
    c.drawString(1.2 * cm, A4[1] - 1.2 * cm, f"{pattern_name} — Sida {row+1}-{col+1}")

    # Stor halvgenomskinlig sidnumrering i mitten
    page_number = f"{row+1}-{col+1}"
    c.saveState()
    c.setFont("Helvetica-Bold", 100)
    c.setFillAlpha(0.3)
    c.setFillColorRGB(0.2, 0.2, 0.2)
    text_width = c.stringWidth(page_number, "Helvetica-Bold", 100)
    c.drawString((A4[0] - text_width)/2, (A4[1] - 100)/2, page_number)
    c.restoreState()

    # Ram, limzoner och kryss
    margin = 0.5 * cm
    overlap = 1.0 * cm
    dash_len = 3
    c.setDash(dash_len, dash_len)
    c.setLineWidth(0.1)
    c.setStrokeColorRGB(0.5, 0.5, 0.5)
    c.line(margin, margin, A4[0]-margin, margin)
    c.line(margin, A4[1]-margin, A4[0]-margin, A4[1]-margin)
    c.line(margin, margin, margin, A4[1]-margin)
    c.line(A4[0]-margin, margin, A4[0]-margin, A4[1]-margin)

    if col < pages_x - 1:
        c.setFillGray(0.9)
        c.rect(A4[0] - overlap, 0, overlap, A4[1], fill=1, stroke=0)
    if row < pages_y - 1:
        c.setFillGray(0.9)
        c.rect(0, 0, A4[0], overlap, fill=1, stroke=0)

    mark_len = 0.3 * cm
    for x, y in [(margin, margin), (A4[0]-margin, margin), (margin, A4[1]-margin), (A4[0]-margin, A4[1]-margin)]:
        c.setStrokeColorRGB(0, 0, 0)
        c.line(x - mark_len, y, x + mark_len, y)
        c.line(x, y - mark_len, x, y + mark_len)

@app.route("/generate", methods=["POST"])
def generate():
    pattern_name = request.form["pattern_name"].strip()
    waist = float(request.form["waist"])
    length = float(request.form["length"])
    hem = float(request.form["hem"])
    sections = int(request.form["sections"])

    if sections < 1:
        return "Antal sektioner måste vara minst 1", 400

    waist_section = waist / sections
    hem_section = hem / sections

    inner_radius = waist_section / (2 * math.pi)
    outer_radius = inner_radius + length
    angle = 360 * (waist_section / hem_section)

    pattern_width_cm = (outer_radius + 2) * 2
    pattern_height_cm = (outer_radius + 2) * 2

    use_landscape = pattern_width_cm > pattern_height_cm
    page_size = landscape(A4) if use_landscape else portrait(A4)
    page_width_cm = page_size[0] / cm
    page_height_cm = page_size[1] / cm

    pages_x = math.ceil(pattern_width_cm / page_width_cm)
    pages_y = math.ceil(pattern_height_cm / page_height_cm)

    total_width = pages_x * page_width_cm
    total_height = pages_y * page_height_cm

    buffer = BytesIO()
    c = canvas.Canvas(buffer, pagesize=page_size)

    draw_first_page(c, pattern_name, waist_section, length, hem_section, pages_x, pages_y, total_width, total_height)
    c.showPage()

    for row in range(pages_y):
        for col in range(pages_x):
            c.setPageSize(page_size)
            draw_pattern_page(c, pattern_name, row, col, pages_x, pages_y, waist_section, length, hem_section, total_width, total_height, angle)
            c.showPage()

    c.save()
    buffer.seek(0)

    filename = generate_filename(pattern_name)
    return send_file(buffer, as_attachment=True, download_name=filename, mimetype='application/pdf')

if __name__ == "__main__":
    app.run(debug=True)
