#!/usr/bin/env python3
"""Update assigned_staff on Issues from legacy ticket.assign_to → staff name."""
import pymysql
import psycopg2

LEGACY = {"host": "legacy-db", "user": "facturation", "password": "***LEGACY-DB-PW-REDACTED***",
          "database": "gestionclient", "connect_timeout": 30, "read_timeout": 600}
PG = {"host": "db", "port": 5432, "user": "postgres", "password": "123",
      "dbname": "_eb65bdc0c4b1b2d6"}

def main():
    # 1. Get staff mapping from legacy
    mc = pymysql.connect(**LEGACY)
    cur = mc.cursor(pymysql.cursors.DictCursor)

    cur.execute("SELECT id, first_name, last_name FROM staff ORDER BY id")
    staff_map = {}
    for s in cur.fetchall():
        name = ((s["first_name"] or "") + " " + (s["last_name"] or "")).strip()
        if name:
            staff_map[s["id"]] = name

    # Get all tickets with assign_to
    cur.execute("SELECT id, assign_to FROM ticket WHERE assign_to > 0")
    assignments = cur.fetchall()
    mc.close()
    print(f"{len(assignments)} assignments, {len(staff_map)} staff names")

    # 2. Connect ERPNext
    pg = psycopg2.connect(**PG)
    pgc = pg.cursor()

    # Add column if not exists
    pgc.execute("SELECT column_name FROM information_schema.columns WHERE table_name = 'tabIssue' AND column_name = 'assigned_staff'")
    if not pgc.fetchone():
        pgc.execute('ALTER TABLE "tabIssue" ADD COLUMN assigned_staff varchar(140)')
        pg.commit()
        print("Column assigned_staff added")
    else:
        print("Column assigned_staff already exists")

    # Build mapping: legacy_ticket_id -> staff_name
    batch = {}
    for a in assignments:
        name = staff_map.get(a["assign_to"])
        if name:
            batch[a["id"]] = name

    print(f"{len(batch)} tickets to update")

    # Batch update using temp table for speed
    pgc.execute("""
        CREATE TEMP TABLE _staff_assign (
            legacy_ticket_id integer PRIMARY KEY,
            staff_name varchar(140)
        )
    """)

    # Insert in chunks
    items = list(batch.items())
    for i in range(0, len(items), 10000):
        chunk = items[i:i+10000]
        args = ",".join(pgc.mogrify("(%s,%s)", (tid, name)).decode() for tid, name in chunk)
        pgc.execute("INSERT INTO _staff_assign VALUES " + args)
        print(f"  loaded chunk {i//10000+1}")
    pg.commit()

    # Single UPDATE join
    pgc.execute("""
        UPDATE "tabIssue" i
        SET assigned_staff = sa.staff_name
        FROM _staff_assign sa
        WHERE i.legacy_ticket_id = sa.legacy_ticket_id
          AND (i.assigned_staff IS NULL OR i.assigned_staff = '')
    """)
    updated = pgc.rowcount
    pg.commit()

    pgc.execute("DROP TABLE _staff_assign")
    pg.commit()
    pg.close()

    print(f"Updated: {updated} issues with assigned_staff")

if __name__ == "__main__":
    main()
