#!/usr/bin/env python3
"""
Rollback giacenze a sabato 25 gennaio 2026
===========================================

Algoritmo:
1. Per ogni sede in enigma
2. Recupera stock ATTUALI (inventario lunedì)
3. Recupera TUTTI i movimenti da sabato 25 a lunedì 27
4. Calcola: giacenza_sabato = giacenza_attuale - sum(movimenti)
5. Aggiorna inv_giacenze con i valori di sabato 25
"""

import requests
import pymysql
import json
from collections import defaultdict

API_KEY = "2285eee4-ba07-4037-b880-165e3dda83d9"
CASSANOVA_API = "https://api.cassanova.com"

# Date di interesse
DATE_FROM = "2026-01-25"  # Sabato (inizio inventario)
DATE_TO = "2026-01-27"    # Oggi lunedì (fine periodo)

print("="*70)
print("ROLLBACK GIACENZE A SABATO 25 GENNAIO")
print("="*70)

# Step 1: Genera token
print("\n🔑 Generazione token...")
response = requests.post(
    f"{CASSANOVA_API}/apikey/token",
    headers={"Content-Type": "application/json", "X-Requested-With": "*"},
    json={"apiKey": API_KEY}
)

if response.status_code != 200:
    print(f"❌ Errore token: {response.status_code}")
    exit(1)

TOKEN = response.json()['access_token']
print("✅ Token ottenuto")

# Step 2: Connetti a enigma
print("\n📊 Connessione database enigma...")
conn = pymysql.connect(
    host="localhost",
    user="enigma_user",
    password="arcana2026",
    database="enigma",
    charset='utf8mb4',
    cursorclass=pymysql.cursors.DictCursor
)
cursor = conn.cursor()

# Step 3: Recupera tutte le sedi
print("📍 Recupero sedi...")
cursor.execute("SELECT id FROM inv_sedi WHERE id_tenant = 1 ORDER BY id")
sedi = [row['id'] for row in cursor.fetchall()]
print(f"Trovate {len(sedi)} sedi: {sedi}\n")

# Per ogni sede
total_updated = 0

for sede_id in sedi:
    print(f"🔄 Sede {sede_id}...")
    
    try:
        # Recupera movimenti per questa sede
        print(f"   📥 Recupero movimenti da Cassanova...", end=" ", flush=True)
        
        movimenti_per_prodotto = defaultdict(float)
        start = 0
        pagina = 1
        
        while True:
            response = requests.get(
                f"{CASSANOVA_API}/stocks/{sede_id}/movements",
                headers={
                    "Authorization": f"Bearer {TOKEN}",
                    "Content-Type": "application/json",
                    "X-Version": "1.0.0"
                },
                params={
                    "start": start,
                    "limit": 5000,
                    "datetimeFrom": f'"{DATE_FROM}"',
                    "datetimeTo": f'"{DATE_TO}"'
                },
                timeout=30
            )
            
            if response.status_code != 200:
                print(f"❌ Errore {response.status_code}")
                break
            
            data = response.json()
            movimenti = data.get('stockMovements', [])
            total_count = data.get('totalCount', 0)
            
            if not movimenti:
                break
            
            # Aggrega movimenti per prodotto
            for mov in movimenti:
                product_id = mov.get('idProduct')
                quantity = float(mov.get('quantity', 0))
                movimenti_per_prodotto[product_id] += quantity
            
            start += len(movimenti)
            if start >= total_count:
                break
            
            pagina += 1
        
        print(f"✓ {len(movimenti_per_prodotto)} prodotti con movimenti")
        
        # Aggiorna giacenze per questa sede
        print(f"   ⚙️  Calcolo giacenze sabato...", end=" ", flush=True)
        
        updated = 0
        
        for product_id, total_movimento in movimenti_per_prodotto.items():
            # Giacenza di sabato = giacenza attuale - movimenti
            # Se movimento = -1 (vendita), allora giacenza_sabato = attuale + 1
            
            cursor.execute("""
                SELECT quantita 
                FROM inv_giacenze 
                WHERE id_prodotto = %s AND id_sede = %s AND id_tenant = 1
            """, (product_id, sede_id))
            
            result = cursor.fetchone()
            
            if result:
                giacenza_attuale = float(result['quantita'])
                giacenza_sabato = giacenza_attuale - total_movimento
                
                cursor.execute("""
                    UPDATE inv_giacenze 
                    SET quantita = %s
                    WHERE id_prodotto = %s AND id_sede = %s AND id_tenant = 1
                """, (giacenza_sabato, product_id, sede_id))
                
                updated += 1
        
        conn.commit()
        print(f"✓ Aggiornati {updated} record")
        total_updated += updated
        
    except Exception as e:
        print(f"   ❌ Errore: {e}")
        continue

cursor.close()
conn.close()

print(f"\n{'='*70}")
print(f"✨ ROLLBACK COMPLETATO")
print(f"{'='*70}")
print(f"Totale giacenze aggiornate: {total_updated}")
print(f"\nLe giacenze di enigma sono ora allineate a SABATO 25 GENNAIO")
print(f"Puoi copiare inv_giacenze su tmov quando pronto")
print(f"{'='*70}")
