
import csv, json, sys, sqlite3
from pathlib import Path

BASE_DIR = Path("/var/www/vps2.happyuser.info/AIMA_bot")
DATASET  = "users_without_shop_202605191510"
BATCH_SIZE = 30

CONTACTS_FIELDS = [
    "pilot_id","pilot_name","lead_id","dataset","segment","variant",
    "hypothesis","gate1_text","phone","first_name","last_name",
    "registered_at","last_activity_at","worker-do-not-send",
    "pre_contact_quality","contamination_status","notes",
]
LOG_FIELDS = [
    "pilot_id","lead_id","dataset","hypothesis","phone",
    "worker-do-not-send","added_to_telegram","telegram_contact_name",
    "gate1_message_sent","replied","reply_text","next_gate","notes",
    "sent_at_utc","recipient_id","message_len","message_preview",
    "chat_started","replied_at_utc","reply_category",
    "pre_contact_quality","contamination_status",
    "qualified_product_reply","next_step_accepted","negative_stop","reply_class",
]

# 1. Витягти variant тексти з v9
print("[step1] Читаю variant тексти з v9...")
variant_texts = {}
with open(f"{BASE_DIR}/data/processed/aima_far_v9_contacts.csv", encoding="utf-8-sig") as f:
    for row in csv.DictReader(f):
        v = row.get("variant","").strip()
        t = row.get("gate1_text","").strip()
        if v and t and v not in variant_texts:
            variant_texts[v] = t

print(f"  Варіанти: {list(variant_texts.keys())}")
for k,v in variant_texts.items():
    print(f"  {k}: {v[:80]}")

if len(variant_texts) < 2:
    print("[error] Менше 2 варіантів — виходжу")
    sys.exit(1)

# 2. collect_used
print("\n[step2] Збираю використані leads/phones...")
used_leads  = set()
used_phones = set()
for p in sorted((BASE_DIR/"data/processed").glob("*.csv")):
    with p.open(encoding="utf-8-sig") as f:
        for row in csv.DictReader(f):
            lid = str(row.get("lead_id","") or "").strip()
            ph  = str(row.get("phone","") or "").strip()
            if lid: used_leads.add(lid)
            if ph:  used_phones.add(ph)

print(f"  used_leads={len(used_leads)} used_phones={len(used_phones)}")

# 3. Наступний pilot_id_start
max_id = 120
for p in (BASE_DIR/"data/processed").glob("aima_far_v*_contacts.csv"):
    with p.open(encoding="utf-8-sig") as f:
        for row in csv.DictReader(f):
            try: max_id = max(max_id, int(row.get("pilot_id",0) or 0))
            except: pass
pilot_id_start = max_id + 1
print(f"  pilot_id_start={pilot_id_start}")

# 4. Fetch candidates з SQLite
print("\n[step3] Читаю кандидатів з SQLite...")
conn = sqlite3.connect(str(BASE_DIR/"data/processed/aima_conversion_shadow.sqlite"))
cur  = conn.cursor()
cur.execute("""SELECT lead_id, first_name, last_name, phone, registered_at, last_activity_at
               FROM aima_imported_contacts WHERE dataset=? ORDER BY row_index DESC""",
            (DATASET,))
all_rows = cur.fetchall()
conn.close()
print(f"  Всього в DB: {len(all_rows)}")

candidates = [r for r in all_rows
              if r[3] and str(r[0]) not in used_leads and r[3] not in used_phones]
print(f"  Нових кандидатів: {len(candidates)}")

if len(candidates) < BATCH_SIZE:
    print(f"[error] Недостатньо: {len(candidates)} < {BATCH_SIZE}")
    sys.exit(1)

selected = candidates[:BATCH_SIZE]

# 5. Побудова v10
batch_key = "v10"
v_keys = list(variant_texts.keys())
half = BATCH_SIZE // 2
pilot_name = f"manual_far_{batch_key}"

contacts_csv = BASE_DIR/f"data/processed/aima_far_{batch_key}_contacts.csv"
log_csv      = BASE_DIR/f"data/processed/aima_far_{batch_key}_telegram_log.csv"

contact_rows = []
log_rows = []
for i, (lead_id, first_name, last_name, phone, reg_at, last_at) in enumerate(selected):
    pid = pilot_id_start + i
    variant = v_keys[0] if i < half else v_keys[1 % len(v_keys)]
    gate1_text = variant_texts[variant]
    contact_rows.append({
        "pilot_id": pid, "pilot_name": pilot_name, "lead_id": lead_id,
        "dataset": DATASET, "segment": "opened_no_store",
        "variant": variant, "hypothesis": variant, "gate1_text": gate1_text,
        "phone": phone, "first_name": first_name or "", "last_name": last_name or "",
        "registered_at": reg_at or "", "last_activity_at": last_at or "",
        "worker-do-not-send": "", "pre_contact_quality": "unknown",
        "contamination_status": "unknown", "notes": f"FAR candidate batch {batch_key}",
    })
    log_row = {k: "" for k in LOG_FIELDS}
    log_row.update({"pilot_id": pid, "lead_id": lead_id, "dataset": DATASET,
                    "hypothesis": variant, "phone": phone,
                    "pre_contact_quality": "unknown", "contamination_status": "unknown"})
    log_rows.append(log_row)

with contacts_csv.open("w", encoding="utf-8", newline="") as f:
    w = csv.DictWriter(f, fieldnames=CONTACTS_FIELDS)
    w.writeheader(); w.writerows(contact_rows)
print(f"[step4] Записано {contacts_csv.name}: {len(contact_rows)} рядків")

with log_csv.open("w", encoding="utf-8", newline="") as f:
    w = csv.DictWriter(f, fieldnames=LOG_FIELDS)
    w.writeheader(); w.writerows(log_rows)
print(f"[step4] Записано {log_csv.name}: {len(log_rows)} рядків")

# 6. Генерація send script (копія v9 з заміною імен)
v9_script  = BASE_DIR/"src/aima_batch_send_v9.py"
v10_script = BASE_DIR/f"src/aima_batch_send_{batch_key}.py"
if v9_script.exists():
    src = v9_script.read_text(encoding="utf-8")
    src = src.replace("aima_far_v9_contacts.csv",       f"aima_far_{batch_key}_contacts.csv")
    src = src.replace("aima_far_v9_telegram_log.csv",   f"aima_far_{batch_key}_telegram_log.csv")
    src = src.replace("batch_send_v9",                  f"batch_send_{batch_key}")
    src = src.replace("AIMA FAR v9 pilot",              f"AIMA FAR {batch_key} pilot")
    v10_script.write_text(src, encoding="utf-8")
    print(f"[step5] Скрипт {v10_script.name} створено")

# 7. Оновити bot state (додати v10 в proposals, встановити active_batch)
state_path = BASE_DIR/"data/processed/aima_bot_state.json"
state = json.loads(state_path.read_text(encoding="utf-8"))
state["proposals"]["v10"] = {
    "name": f"FAR v10 — {BATCH_SIZE} контактів (скачали, не відкрили магазин)",
    "contacts_csv": str(contacts_csv),
    "log_csv":      str(log_csv),
    "send_script":  str(v10_script),
    "gdrive_url":   "",
}
state["active_batch"] = "v10"
state["pending"]      = "v10"
state_path.write_text(json.dumps(state, ensure_ascii=False, indent=2), encoding="utf-8")
print("[step6] bot_state.json оновлено: active_batch=v10")

print("\n[OK] v10 готово. Перші 5 контактів:")
for r in contact_rows[:5]:
    print(f"  pilot_id={r['pilot_id']} phone={r['phone']} variant={r['variant']}")
print(f"  ... і ще {BATCH_SIZE-5} контактів")
