#!/usr/bin/env python3
"""
Assign categories to Strada inventory based on pcode from TODO.st01.
Creates categories if they don't exist and updates inventory.category_id.
"""

import os
import sys

sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..', 'pos'))
from tenant_db import get_tenant_conn

# pcode → category name mapping (inferred from common auto parts codes)
PCODE_MAP = {
    'SU': 'Suspensión',
    'SO': 'Soportería',
    'MA': 'Mangueras',
    'EM': 'Empaques',
    'HQ': 'Herramientas y Equipo',
    'AM': 'Amortiguadores',
    'IG': 'Ignición y Eléctrico',
    'BD': 'Bandas y Correas',
    'BL': 'Baleros',
    'FI': 'Filtros',
    'HE': 'Herramientas',
    'PI': 'Pistones y Anillos',
    'AW': 'Accesorios',
    'BE': 'Baterías y Eléctrico',
    'K0': 'Kit de Servicio',
    'DF': 'Frenos (Discos)',
    'RE': 'Refrigeración',
    'PE': 'Perfiles y Sellos',
    'BG': 'Bujías',
    'TA': 'Toma de Agua',
    'CV': 'Conversiones y Kits',
    'CT': 'Clutch y Transmisión',
    'CC': 'Cilindros y Componentes',
    'OT': 'Otros',
    'SF': 'Soportes y Bases',
    'BT': 'Bujes y Terminales',
    'HF': 'Herramientas y Ferretería',
    'CR': 'Cremalleras y Dirección',
    'CS': 'Cilindros de Freno',
    'CF': 'Cables y Frenos',
    'FG': 'Faros y Iluminación',
    'TO': 'Tornillería',
    'AO': 'Aceites y Lubricantes',
    'BJ': 'Bujes',
    'FR': 'Frenos',
    'DR': 'Dirección y Rótulas',
    'KT': 'Kits de Reparación',
    'TT': 'Transmisión',
    'BU': 'Bujes y Soportes',
    'PC': 'Poleas y Componentes',
    'CL': 'Clutch',
    'PG': 'Pegamentos y Adhesivos',
    'QU': 'Químicos',
    'TA': 'Toma de Agua',
    'VC': 'Válvulas y Controles',
    'MV': 'Motoventiladores',
    'AS': 'Aspas y Ventiladores',
    'PO': 'Poleas',
    'CM': 'Compresores y A/C',
    'HE': 'Herramientas',
    'EA': 'Enfriadores y Radiadores',
    'CO': 'Conectores',
    'CX': 'Conectores y Cables',
    'TR': 'Tren Delantero',
    'AB': 'Abrazaderas',
    'FU': 'Fusibles',
    'MR': 'Mangueras de Freno',
    'TO': 'Tornillería',
    'RA': 'Radiadores',
    'MC': 'Mangueras y Conectores',
}

def assign_categories(tenant_id):
    conn = get_tenant_conn(tenant_id)
    cur = conn.cursor()
    
    # Get or create categories
    cur.execute("SELECT id, name FROM part_categories")
    existing = {name: id for id, name in cur.fetchall()}
    
    created = 0
    category_map = {}  # pcode -> category_id
    
    for pcode, name in PCODE_MAP.items():
        if name in existing:
            category_map[pcode] = existing[name]
        else:
            cur.execute("INSERT INTO part_categories (name) VALUES (%s) RETURNING id", (name,))
            cat_id = cur.fetchone()[0]
            existing[name] = cat_id
            category_map[pcode] = cat_id
            created += 1
    
    print(f"Categories: {len(existing)} total, {created} created")
    
    # Update inventory items based on location (pcode) field
    updated = 0
    for pcode, cat_id in category_map.items():
        cur.execute("""
            UPDATE inventory
            SET category_id = %s
            WHERE location = %s AND category_id IS NULL
        """, (cat_id, pcode))
        updated += cur.rowcount
    
    conn.commit()
    cur.close()
    conn.close()
    
    print(f"Updated {updated:,} inventory items with categories")
    
    # Show uncategorized items
    conn = get_tenant_conn(tenant_id)
    cur = conn.cursor()
    cur.execute("""
        SELECT location, COUNT(*) FROM inventory
        WHERE category_id IS NULL AND location IS NOT NULL
        GROUP BY location ORDER BY COUNT(*) DESC
    """)
    uncategorized = cur.fetchall()
    if uncategorized:
        print(f"\nUncategorized items by pcode:")
        for pcode, cnt in uncategorized[:20]:
            print(f"  {pcode}: {cnt:,}")
    cur.close()
    conn.close()


if __name__ == '__main__':
    import argparse
    parser = argparse.ArgumentParser()
    parser.add_argument('--tenant', type=int, required=True)
    args = parser.parse_args()
    assign_categories(args.tenant)
