# ============================================================================
# INVENTORY ITEMS - Ricerca, Modifica, Cancellazione
# ============================================================================
# Endpoint per gestire gli items scansionati senza riaprire sessioni
# ============================================================================

from flask import Blueprint, request, jsonify
from functools import wraps
import logging
import os

logger = logging.getLogger(__name__)

items_bp = Blueprint('inventory_items', __name__, url_prefix='/api/v1/items')


def require_auth(f):
    """Decorator per autenticazione"""
    @wraps(f)
    def decorated(*args, **kwargs):
        request.user = {
            'id': 1,
            'tenant_id': 1,
            'email': 'demo@studium.it',
            'role': 'admin'
        }
        return f(*args, **kwargs)
    return decorated


# ============================================================================
# ENDPOINT 1: CERCA ITEMS PER BARCODE O NOME
# ============================================================================

@items_bp.route('/search', methods=['GET'])
@require_auth
def search_items():
    """
    Ricerca items scansionati per barcode o nome (parziale).
    
    Query params:
        - sede_id: ID filiale (obbligatorio)
        - q: Query di ricerca - barcode o nome (obbligatorio)
    
    Returns:
        {
            "success": true,
            "data": [
                {
                    "item_id": 123,
                    "nome_prodotto": "...",
                    "barcode": "...",
                    "quantita_fisica": 5,
                    "id_sessione": 45,
                    "nome_sessione": "Inventario 23/01/2026",
                    "timestamp_scansione": "2026-01-23T10:30:00"
                }
            ]
        }
    """
    try:
        sede_id = request.args.get('sede_id', type=int)
        query = request.args.get('q', '').strip()
        
        if not sede_id or not query:
            return jsonify({
                'success': False,
                'error': 'sede_id e q sono obbligatori'
            }), 400
        
        tenant_id = request.user['tenant_id']
        
        import pymysql
        conn = pymysql.connect(
            host=os.getenv('DB_HOST', 'localhost'),
            user=os.getenv('DB_USER', 'enigma_user'),
            password=os.getenv('DB_PASSWORD', 'arcana2026'),
            database=os.getenv('DB_NAME', 'enigma'),
            charset='utf8mb4',
            cursorclass=pymysql.cursors.DictCursor
        )
        cursor = conn.cursor()
        
        # Cerca per barcode esatto o nome parziale
        cursor.execute("""
            SELECT 
              r.id as item_id,
              r.nome_prodotto,
              r.barcode,
              r.quantita_fisica,
              r.id_sessione,
              s.nome_sessione,
              s.timestamp_fine as timestamp_scansione
            FROM inv_risultati_inventario r
            JOIN inv_sessioni_inventario s ON r.id_sessione = s.id
            WHERE 
              r.id_sede = %s
              AND r.id_tenant = %s
              AND (
                r.barcode = %s 
                OR LOWER(r.nome_prodotto) LIKE LOWER(%s)
              )
            ORDER BY s.timestamp_fine DESC
            LIMIT 50
        """, (sede_id, tenant_id, query, f'%{query}%'))
        
        items = cursor.fetchall()
        cursor.close()
        conn.close()
        
        return jsonify({
            'success': True,
            'data': items,
            'count': len(items)
        }), 200
        
    except Exception as e:
        logger.error(f"Errore search_items: {e}", exc_info=True)
        return jsonify({'success': False, 'error': str(e)}), 500


# ============================================================================
# ENDPOINT 2: MODIFICA QUANTITÀ ITEM
# ============================================================================

@items_bp.route('/<int:item_id>', methods=['PUT'])
@require_auth
def update_item(item_id):
    """
    Modifica la quantità di un item scansionato.
    
    Body:
        {
            "quantita_fisica": 10
        }
    
    Returns:
        {
            "success": true,
            "data": {
                "item_id": 123,
                "quantita_fisica": 10,
                "old_quantity": 5
            }
        }
    """
    try:
        data = request.get_json()
        nuova_quantita = data.get('quantita_fisica')
        
        if nuova_quantita is None or nuova_quantita < 0:
            return jsonify({
                'success': False,
                'error': 'quantita_fisica deve essere >= 0'
            }), 400
        
        tenant_id = request.user['tenant_id']
        
        import pymysql
        conn = pymysql.connect(
            host=os.getenv('DB_HOST', 'localhost'),
            user=os.getenv('DB_USER', 'enigma_user'),
            password=os.getenv('DB_PASSWORD', 'arcana2026'),
            database=os.getenv('DB_NAME', 'enigma'),
            charset='utf8mb4',
            cursorclass=pymysql.cursors.DictCursor
        )
        cursor = conn.cursor()
        
        # ✅ Verifica che l'item appartenga al tenant
        cursor.execute("""
            SELECT id, quantita_fisica FROM inv_risultati_inventario
            WHERE id = %s AND id_tenant = %s
        """, (item_id, tenant_id))
        
        item = cursor.fetchone()
        if not item:
            cursor.close()
            conn.close()
            return jsonify({
                'success': False,
                'error': 'Item non trovato'
            }), 404
        
        quantita_vecchia = item['quantita_fisica']
        
        # ✅ Aggiorna la quantità
        cursor.execute("""
            UPDATE inv_risultati_inventario
            SET quantita_fisica = %s
            WHERE id = %s AND id_tenant = %s
        """, (nuova_quantita, item_id, tenant_id))
        
        conn.commit()
        cursor.close()
        conn.close()
        
        logger.info(f"Item {item_id} aggiornato: {quantita_vecchia} → {nuova_quantita}")
        
        return jsonify({
            'success': True,
            'data': {
                'item_id': item_id,
                'quantita_fisica': nuova_quantita,
                'old_quantity': quantita_vecchia
            }
        }), 200
        
    except Exception as e:
        logger.error(f"Errore update_item: {e}", exc_info=True)
        return jsonify({'success': False, 'error': str(e)}), 500


# ============================================================================
# ENDPOINT 3: ELIMINA ITEM
# ============================================================================

@items_bp.route('/<int:item_id>', methods=['DELETE'])
@require_auth
def delete_item(item_id):
    """
    Elimina completamente un item scansionato.
    
    Returns:
        {
            "success": true,
            "data": {
                "item_id": 123,
                "deleted": true,
                "nome_prodotto": "..."
            }
        }
    """
    try:
        tenant_id = request.user['tenant_id']
        
        import pymysql
        conn = pymysql.connect(
            host=os.getenv('DB_HOST', 'localhost'),
            user=os.getenv('DB_USER', 'enigma_user'),
            password=os.getenv('DB_PASSWORD', 'arcana2026'),
            database=os.getenv('DB_NAME', 'enigma'),
            charset='utf8mb4',
            cursorclass=pymysql.cursors.DictCursor
        )
        cursor = conn.cursor()
        
        # ✅ Verifica che l'item esista
        cursor.execute("""
            SELECT id, nome_prodotto FROM inv_risultati_inventario
            WHERE id = %s AND id_tenant = %s
        """, (item_id, tenant_id))
        
        item = cursor.fetchone()
        if not item:
            cursor.close()
            conn.close()
            return jsonify({
                'success': False,
                'error': 'Item non trovato'
            }), 404
        
        nome_prodotto = item['nome_prodotto']
        
        # ✅ ELIMINA l'item (traccia zero)
        cursor.execute("""
            DELETE FROM inv_risultati_inventario
            WHERE id = %s AND id_tenant = %s
        """, (item_id, tenant_id))
        
        conn.commit()
        cursor.close()
        conn.close()
        
        logger.info(f"Item {item_id} ({nome_prodotto}) eliminato")
        
        return jsonify({
            'success': True,
            'data': {
                'item_id': item_id,
                'deleted': True,
                'nome_prodotto': nome_prodotto
            }
        }), 200
        
    except Exception as e:
        logger.error(f"Errore delete_item: {e}", exc_info=True)
        return jsonify({'success': False, 'error': str(e)}), 500
