"""
v5 - Noiva + convidados IA compostos em FOTO REAL da Chacara Sonho Verde Top.

Abordagem B (auto-critica da v4): manter autenticidade estrutural usando foto real
como base, adicionando apenas as pessoas via IA.

Base fotografica: foto_33.jpg (pergolado com bougainvillea + caminho de tijolos)
Pessoas: extraidas de v4_noiva_raw.png via rembg
"""
from pathlib import Path
from PIL import Image, ImageEnhance, ImageFilter, ImageDraw
from rembg import remove
import io

BASE = Path("/opt/mia/workspace/clientes/chacara-sonho-verde/variacoes_casamento_2026-08-11")
FOTO_REAL = Path("/opt/mia/workspace/chacarasonhoverdetop/fotos/foto_33.jpg")
NOIVA_RAW = BASE / "v4_noiva_raw.png"
COMPOSITE_OUT = BASE / "v5_composite_raw.png"

# ----- 1. Preparar fundo (foto real) em 1080x1350 -----
bg = Image.open(FOTO_REAL).convert("RGB")
# foto_33 = 864x1152 (proporcao ~3:4). Precisamos 1080x1350 (4:5).
# 1080/864 = 1.25 escala. 864*1.25=1080, 1152*1.25=1440. Precisa cortar 90px do topo/base.
bg = bg.resize((1080, 1440), Image.LANCZOS)
# crop centralizado vertical pra 1350
bg = bg.crop((0, 45, 1080, 1395))

# Ajuste de tom pra ficar mais golden hour (casar com a luz da noiva IA)
# Aumenta warmth: sombra os canais azul, boost sutil no vermelho
r, g, b = bg.split()
r = r.point(lambda x: min(255, int(x * 1.06)))
b = b.point(lambda x: int(x * 0.92))
bg = Image.merge("RGB", (r, g, b))

# Levemente satura e reduz brilho pra dar mood ceremonia
bg = ImageEnhance.Color(bg).enhance(1.15)
bg = ImageEnhance.Brightness(bg).enhance(0.92)
bg = ImageEnhance.Contrast(bg).enhance(1.08)

# Guardo pra debug
bg.save(BASE / "v5_bg_ajustado.png")
print(f"BG ajustado: {(1080,1350)}")

# ----- 2. Recortar pessoas da noiva IA -----
noiva = Image.open(NOIVA_RAW).convert("RGBA")
print(f"Noiva raw: {noiva.size}")

# Rembg pra tirar fundo
buf_in = io.BytesIO()
noiva.save(buf_in, format="PNG")
buf_in.seek(0)
cutout_bytes = remove(buf_in.getvalue())
cutout = Image.open(io.BytesIO(cutout_bytes)).convert("RGBA")
cutout.save(BASE / "v5_pessoas_cutout.png")
print(f"Cutout OK: {cutout.size}")

# ----- 3. Ajustar cor das pessoas pra casar com o BG -----
# noiva IA ja tem golden hour, entao so um leve warmth-match
r, g, b, a = cutout.split()
rgb = Image.merge("RGB", (r, g, b))
# leve boost warm pra bater com bg
rgb = ImageEnhance.Color(rgb).enhance(1.05)
rgb = ImageEnhance.Brightness(rgb).enhance(0.96)
r2, g2, b2 = rgb.split()
# aquece
r2 = r2.point(lambda x: min(255, int(x * 1.03)))
b2 = b2.point(lambda x: int(x * 0.94))
cutout = Image.merge("RGBA", (r2, g2, b2, a))

# ----- 4. Redimensionar pessoas pra escala coerente na cena -----
# Na foto_33, o pergolado ocupa a metade direita, o caminho de tijolos fica no centro-esquerda.
# Uma noiva real teria ~1.65m. O caminho tem ~1.5m de largura no bg.
# Vou dimensionar o grupo pra caber com a noiva no centro e cabeca dela na altura ~50% da imagem.
# Escala: cutout original 1024x1536. Reduzo pra ~900 de altura no canvas 1350.
target_h = 950
ratio = target_h / cutout.size[1]
target_w = int(cutout.size[0] * ratio)
cutout = cutout.resize((target_w, target_h), Image.LANCZOS)
print(f"Cutout redim: {cutout.size}")

# ----- 5. Posicionar na cena -----
# Composite: quero o grupo centralizado horizontalmente, pes dela apoiados
# aproximadamente na altura do caminho de tijolos (parte inferior do bg).
# Canvas 1080x1350, cutout ~633x950.
canvas = bg.copy().convert("RGBA")
x = (1080 - cutout.size[0]) // 2
# posicionar de forma que os pes fiquem por volta da altura 1280 (perto da base mas com espaco pra copy)
y = 1350 - cutout.size[1] - 50  # deixa 50px de baseline
canvas.alpha_composite(cutout, (x, y))

# ----- 6. Sombra sutil no chao pra dar volume -----
# Cria uma sombra elipse sob os pes
shadow_layer = Image.new("RGBA", canvas.size, (0, 0, 0, 0))
sd = ImageDraw.Draw(shadow_layer)
foot_y = y + cutout.size[1] - 30
foot_cx = x + cutout.size[0] // 2
sd.ellipse(
    [foot_cx - 220, foot_y - 20, foot_cx + 220, foot_y + 35],
    fill=(0, 0, 0, 90),
)
shadow_layer = shadow_layer.filter(ImageFilter.GaussianBlur(radius=25))
# aplico shadow ANTES do cutout — refaco a composicao
canvas = bg.copy().convert("RGBA")
canvas.alpha_composite(shadow_layer)
canvas.alpha_composite(cutout, (x, y))

# ----- 7. Vinheta suave nas bordas pra integrar melhor -----
vignette = Image.new("L", canvas.size, 255)
vd = ImageDraw.Draw(vignette)
for i in range(60):
    alpha = int(255 * (1 - i / 60) ** 2)
    vd.rectangle([i * 2, i * 2, canvas.size[0] - i * 2, canvas.size[1] - i * 2], outline=alpha)
vignette = vignette.filter(ImageFilter.GaussianBlur(radius=80))
# aplica vinheta multiplicando
canvas_rgb = canvas.convert("RGB")
enhancer = ImageEnhance.Brightness(canvas_rgb)
dark = enhancer.enhance(0.55)
canvas_rgb = Image.composite(canvas_rgb, dark, vignette)
canvas = canvas_rgb.convert("RGBA")

canvas.convert("RGB").save(COMPOSITE_OUT, quality=95)
print(f"OK composite: {COMPOSITE_OUT}")
