"""Full pipeline test with ALL fields"""
import requests, json, subprocess, os, time
import numpy as np
import soundfile as sf

VOXCPM_URL = "http://192.168.1.127:8101"
WHISPER_PYTHON = "/home/shingokuga/Vllm/vllm/bin/python3"
BASEROW_URL = "http://192.168.1.127:8091"
LLM_URL = "http://192.168.1.127:8092"
RCC_TABLE_ID = 715

print("=" * 70)
print("🏗️  Rapport de Chantier — Full Pipeline Test v2")
print("=" * 70)

# 1. Generate audio
print("\n1️⃣  VoxCPM2 — Génération audio...")
text = "Bonjour et bienvenue dans ce rapport de chantier. Nous sommes le 23 avril 2026 et nous intervenons sur le chantier de rénovation du centre-ville de Montpellier. L'équipe au complet est présente : trois maçons, deux électriciens et un menuisier. Le chantier a démarré à 7 heures du matin et les conditions météorologiques sont excellentes. Les travaux concernent la rénovation des façades du bâtiment principal, avec environ 150 mètres carrés de surface. L'équipe de maçons a été très efficace et a terminé cette partie avant midi. Un problème a été détecté : une infiltration d'eau au niveau de la toiture du bâtiment annexe. La solution envisagée est de refaire l'étanchéité complète. Le matériel utilisé inclut 20 sacs de mortier, 10 litres de primaire d'accrochage et 2 kits LED. La conformité sécurité est conforme."

start = time.time()
r = requests.post(
    f"{VOXCPM_URL}/v1/audio/speech",
    json={"model": "openbmb/VoxCPM2", "input": f"(voix masculine professionnelle, ton sérieux) {text}", "cfg_value": 2.0, "inference_timesteps": 10},
)
gen_time = time.time() - start
print(f"   ✅ Audio généré en {gen_time:.1f}s")

# 2. Transcribe
print("\n2️⃣  Whisper Large v3 — Transcription...")
wav_path = "/tmp/rcc_test.wav"
with open(wav_path, "wb") as f:
    f.write(r.content)

start = time.time()
result = subprocess.run(
    [WHISPER_PYTHON, "-c", f"""
import torch
from transformers import AutoProcessor, WhisperForConditionalGeneration
processor = AutoProcessor.from_pretrained("openai/whisper-large-v3")
model = WhisperForConditionalGeneration.from_pretrained("openai/whisper-large-v3", dtype=torch.float16, device_map="cuda:0")
import soundfile as sf
samples, sr = sf.read("{wav_path}")
import numpy as np
target_sr = 16000
num_samples = int(len(samples) * target_sr / sr)
samples_16k = np.interp(np.linspace(0, len(samples), num_samples), np.linspace(0, len(samples), len(samples)), samples)
input_features = processor(samples_16k, sampling_rate=target_sr, return_tensors="pt").input_features
input_features = input_features.to("cuda:0", dtype=torch.float16)
output_ids = model.generate(input_features, language="fr", max_new_tokens=256)
text = processor.batch_decode(output_ids, skip_special_tokens=True)[0]
print(text)
"""],
    capture_output=True, text=True, timeout=120
)
transcribe_time = time.time() - start
transcription = result.stdout.strip()
print(f"   ✅ Transcription en {transcribe_time:.1f}s")
print(f"   📝 {transcription[:200]}...")

# 3. Extract with LLM
print("\n3️⃣  LLM Qwen3.6-35B — Extraction complète...")
start = time.time()
r = requests.post(f"{LLM_URL}/v1/chat/completions", json={
    "model": "qwen36-35b-official",
    "messages": [{"role": "user", "content": f"Tu es un assistant pour un rapport de chantier. À partir de cette transcription, extrais au format JSON TOUTES les informations :\n\nDate: 2026-04-23\nLieu: Montpellier\nÉquipe: 3 maçons, 2 électriciens, 1 menuisier\n\nTranscription:\n{transcription}\n\nExtrait ces champs au format JSON:\n{{\"observations\": \"\", \"anomalies\": \"\", \"problemes\": \"\", \"solutions\": \"\", \"materiel\": \"\", \"equipement\": \"\", \"prochainesEtapes\": \"\", \"photosAPrendre\": \"\", \"conformite\": \"Conforme|Non conforme|En cours\", \"duree\": \"\", \"heureDebut\": \"\", \"heureFin\": \"\", \"clientsPresent\": \"\", \"couteEstime\": \"\", \"documentsJoints\": \"\", \"commentaires\": \"\"}}\n\nSi un champ n'est pas mentionné, mets \"\"."}],
    "max_tokens": 1500,
}, timeout=60)
extract_time = time.time() - start
data = r.json()
if "choices" not in data:
    print(f"   ✗ LLM error: {data}")
    exit(1)
text = data["choices"][0]["message"]["content"]
extracted = json.loads(text)
print(f"   ✅ Extraction en {extract_time:.1f}s")
for k, v in extracted.items():
    print(f"   📝 {k}: {v[:80] if len(v) > 80 else v}")

# 4. Save to Baserow
print("\n4️⃣  Baserow — Sauvegarde...")
token = requests.post(
    f"{BASEROW_URL}/api/user/token-auth/",
    json={"email": "kmorhaim@hotmail.com", "password": "nYKG9!x?s8?hCyeb"},
).json()["access_token"]
headers = {"Authorization": f"JWT {token}"}

row_data = {
    "field_6937": "2026-04-23", "field_6938": "Montpellier", "field_6939": "Ciel dégagé, 22°C",
    "field_6940": "3 maçons, 2 électriciens, 1 menuisier", "field_6941": transcription,
    **{f"field_{fid}": extracted.get(k, "") for k, fid in {
        "observations": 6942, "anomalies": 6943, "problemes": 6947, "solutions": 6948,
        "materiel": 6949, "equipement": 6950, "prochainesEtapes": 6951, "photosAPrendre": 6952,
        "couteEstime": 6958, "commentaires": 6960,
    }.items()}
}
row_data["field_6953"] = "Conforme"
row_r = requests.post(
    f"{BASEROW_URL}/api/database/rows/table/{RCC_TABLE_ID}/",
    headers=headers,
    json=row_data,
)
print(f"   ✅ Sauvegardé en Baserow")

print("\n" + "=" * 70)
print("✅ Pipeline complet fonctionnel!")
print("=" * 70)
print(f"\n🌐 Preview: https://rcc.zrok.consulting-ai.eu")
print(f"📊 VoxCPM2: {gen_time:.1f}s pour ~30s (RTF {gen_time/30:.2f})")
print(f"⚡ Whisper: {transcribe_time:.1f}s pour ~30s (RTF {transcribe_time/30:.2f})")
print(f"🤖 LLM: {extract_time:.1f}s pour extraction complète")
