import math
import random

from pyscript import document, window
from pyodide.ffi import create_proxy

canvas = document.querySelector("#canvas")
ctx = canvas.getContext("2d")
hint = document.querySelector("#hint")
loader = document.querySelector("#loader")

TAU = math.pi * 2
MAX_FLOWERS = 80

# (ڕەنگی گەڵاکان, ڕەنگی ناوەڕاست)
PALETTES = [
    ("#ff4d8d", "#ffd23f"),
    ("#b44dff", "#ffe97a"),
    ("#ff7a3d", "#fff3a0"),
    ("#4dc3ff", "#ffffff"),
    ("#ff5c5c", "#ffd23f"),
]

W = 0
H = 0
flowers = []


def resize(*_):
    global W, H
    dpr = window.devicePixelRatio or 1
    W = window.innerWidth
    H = window.innerHeight
    canvas.width = int(W * dpr)
    canvas.height = int(H * dpr)
    ctx.setTransform(dpr, 0, 0, dpr, 0, 0)


def bezier_point(p0, p1, p2, u):
    """خاڵێک لەسەر هێڵی خوارەوەی قەد (quadratic bezier) دەدۆزێتەوە."""
    return (1 - u) ** 2 * p0 + 2 * (1 - u) * u * p1 + u ** 2 * p2


class Flower:
    def __init__(self, x, top_y):
        self.x = x
        self.top = top_y
        self.t = 0.0
        self.phase = random.uniform(0, TAU)
        self.spin = random.uniform(0, TAU)
        self.petals = random.randint(5, 8)
        self.size = random.uniform(22, 38)
        self.outer, self.center = random.choice(PALETTES)

    def draw(self, time):
        self.t = min(1.0, self.t + 0.012)
        grow = 1 - (1 - self.t) ** 3  # ئاسانکردنی جووڵە

        base_y = H
        tip_y = base_y - (base_y - self.top) * grow
        sway = math.sin(time * 1.2 + self.phase) * 14 * grow
        tip_x = self.x + sway
        ctrl_x = self.x - sway * 0.4
        ctrl_y = (base_y + tip_y) / 2

        # قەد
        ctx.beginPath()
        ctx.moveTo(self.x, base_y)
        ctx.quadraticCurveTo(ctrl_x, ctrl_y, tip_x, tip_y)
        ctx.strokeStyle = "#3fae5a"
        ctx.lineWidth = 3
        ctx.lineCap = "round"
        ctx.stroke()

        # گەڵا
        if grow > 0.3:
            lx = bezier_point(self.x, ctrl_x, tip_x, 0.45)
            ly = bezier_point(base_y, ctrl_y, tip_y, 0.45)
            leaf = min(1.0, (grow - 0.3) / 0.4)
            for side in (-1, 1):
                ctx.save()
                ctx.translate(lx, ly)
                ctx.rotate(side * 0.7)
                ctx.beginPath()
                ctx.ellipse(side * 9 * leaf, 0, 10 * leaf, 4 * leaf, 0, 0, TAU)
                ctx.fillStyle = "#55c46f"
                ctx.fill()
                ctx.restore()

        # گوڵ
        if grow > 0.55:
            bloom = (grow - 0.55) / 0.45
            s = self.size * bloom
            ctx.shadowBlur = 22
            ctx.shadowColor = self.outer
            for i in range(self.petals):
                ctx.save()
                ctx.translate(tip_x, tip_y)
                ctx.rotate(self.spin + i * TAU / self.petals + sway * 0.01)
                g = ctx.createLinearGradient(0, 0, 0, -2 * s)
                g.addColorStop(0, self.center)
                g.addColorStop(1, self.outer)
                ctx.beginPath()
                ctx.ellipse(0, -s * 0.9, s * 0.45, s, 0, 0, TAU)
                ctx.fillStyle = g
                ctx.fill()
                ctx.restore()
            ctx.shadowBlur = 0

            ctx.beginPath()
            ctx.arc(tip_x, tip_y, s * 0.3, 0, TAU)
            ctx.fillStyle = self.center
            ctx.fill()


last_x = -999


def plant(x, y):
    hint.classList.add("hide")
    flowers.append(Flower(x, max(y, 70)))
    if len(flowers) > MAX_FLOWERS:
        flowers.pop(0)


def add_flower(event):
    # دەست لێدان (touch) یان کلیک
    global last_x
    event.preventDefault()
    last_x = event.clientX
    plant(event.clientX, event.clientY)


def drag_flower(event):
    # ڕاکێشانی پەنجە بەسەر شاشەدا: هەر ٤٠ پیکسڵ گوڵێک دەڕوێت
    global last_x
    if event.buttons and abs(event.clientX - last_x) > 40:
        last_x = event.clientX
        plant(event.clientX, event.clientY)


def frame(now):
    ctx.clearRect(0, 0, W, H)
    t = now / 1000
    for f in flowers:
        f.draw(t)
    window.requestAnimationFrame(frame_proxy)


resize()
window.addEventListener("resize", create_proxy(resize))
canvas.addEventListener("pointerdown", create_proxy(add_flower))
canvas.addEventListener("pointermove", create_proxy(drag_flower))

# چەند گوڵێک لە سەرەتادا
for i in range(5):
    flowers.append(Flower(W * (i + 1) / 6, H * random.uniform(0.35, 0.65)))

loader.classList.add("hide")
hint.classList.remove("hide")

frame_proxy = create_proxy(frame)
window.requestAnimationFrame(frame_proxy)
