"""
app/routes/export.py
====================
Export DEFINITIVO: Source of truth = inv_risultati_inventario (scansioni)

Query semplici, no JSON:
1. Scansionati (inv_risultati_inventario)
2. LEFT JOIN cache_export per nome/categoria/prezzi
3. LEFT JOIN giacenze
4. Catalogo non scansionato
"""

from flask import Blueprint, request, jsonify, send_file
from functools import wraps
from datetime import datetime
import logging
import os
import pymysql

from app.utils.excel_export import generate_inventory_excel

logger = logging.getLogger(__name__)

export_bp = Blueprint('export', __name__, url_prefix='/api/v1/export')


def require_auth(f):
    @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


def get_db_connection():
    db_config = {
        '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')
    }
    return pymysql.connect(**db_config, charset='utf8mb4', cursorclass=pymysql.cursors.DictCursor)


@export_bp.route('/excel/inventory', methods=['POST'])
@require_auth
def export_inventory_excel():
    """Export: scansioni + cache_export + giacenze."""
    
    try:
        data = request.get_json(silent=True) or {}
        sede_id = data.get('sede_id')
        data_valorizzazione = data.get('data_valorizzazione')
        
        if not sede_id or not data_valorizzazione:
            return jsonify({
                'success': False,
                'error': 'sede_id e data_valorizzazione richiesti'
            }), 400
        
        try:
            datetime.strptime(data_valorizzazione, '%Y-%m-%d')
        except ValueError:
            return jsonify({
                'success': False,
                'error': 'Formato data non valido (usa YYYY-MM-DD)'
            }), 400
        
        user = request.user
        tenant_id = user['tenant_id']
        
        conn = get_db_connection()
        cursor = conn.cursor()
        
        cursor.execute("""
            SELECT id, nome FROM inv_sedi 
            WHERE id = %s AND id_tenant = %s
        """, (sede_id, tenant_id))
        
        sede = cursor.fetchone()
        if not sede:
            cursor.close()
            conn.close()
            return jsonify({'success': False, 'error': 'Filiale non trovata'}), 404
        
        sede_nome = sede['nome']
        
        logger.info(f"Inizio export sede {sede_id}...")
        
        # ====================================================================
        # QUERY: SCANSIONATI + cache_export + giacenze
        # ====================================================================
        
        cursor.execute("""
            SELECT
              r.barcode,
              r.nome_prodotto as nome_scan,
              r.categoria as categoria_scan,
              SUM(r.quantita_fisica) as quantita_fisica,
              GROUP_CONCAT(DISTINCT s.note) as sessioni,
              COALESCE(e.descrizione, r.nome_prodotto) as descrizione,
              COALESCE(e.categoria, r.categoria) as categoria,
              COALESCE(e.costo, 0) as costo,
              COALESCE(e.prezzo_pubblico, 0) as prezzo_pubblico,
              COALESCE(e.id_prodotto, '') as id_prodotto,
              COALESCE(g.quantita, 0) as quantita_magazzino
            FROM inv_risultati_inventario r
            LEFT JOIN inv_sessioni_inventario s ON r.id_sessione = s.id
            LEFT JOIN inv_cache_export e
              ON e.codice_barcode = r.barcode
              AND e.id_tenant = r.id_tenant
            LEFT JOIN (
                SELECT id_prodotto, id_sede, id_tenant,
                    COALESCE(
                        MAX(CASE WHEN id_variante IS NULL THEN quantita END),
                        SUM(CASE WHEN id_variante IS NOT NULL THEN quantita ELSE 0 END)
                    ) as quantita
                FROM inv_giacenze
                GROUP BY id_prodotto, id_sede, id_tenant
            ) g ON r.codice_prodotto = g.id_prodotto
              AND g.id_sede = r.id_sede
              AND g.id_tenant = r.id_tenant
            WHERE r.id_tenant = %s AND r.id_sede = %s
            GROUP BY r.barcode, r.nome_prodotto, r.categoria, e.descrizione,
                     e.categoria, e.costo, e.prezzo_pubblico, e.id_prodotto, g.quantita
        """, (tenant_id, sede_id))
        
        scansionati = cursor.fetchall()
        logger.info(f"Scansionati: {len(scansionati)}")
        
        # ====================================================================
        # QUERY: CATALOGO NON SCANSIONATO
        # ====================================================================
        
        cursor.execute("""
            SELECT
              e.codice_barcode,
              e.descrizione,
              e.categoria,
              e.costo,
              e.prezzo_pubblico,
              e.id_prodotto,
              COALESCE(g.quantita, 0) as quantita_magazzino
            FROM inv_cache_export e
            INNER JOIN (
                SELECT id_prodotto, id_sede, id_tenant,
                    COALESCE(
                        MAX(CASE WHEN id_variante IS NULL THEN quantita END),
                        SUM(CASE WHEN id_variante IS NOT NULL THEN quantita ELSE 0 END)
                    ) as quantita
                FROM inv_giacenze
                GROUP BY id_prodotto, id_sede, id_tenant
            ) g ON e.id_prodotto = g.id_prodotto
              AND g.id_sede = %s
              AND g.id_tenant = e.id_tenant
            WHERE e.id_tenant = %s
            AND NOT EXISTS (
              SELECT 1 FROM inv_risultati_inventario r
              WHERE r.barcode = e.codice_barcode
              AND r.id_tenant = e.id_tenant
            )
        """, (sede_id, tenant_id))

        catalogo = cursor.fetchall()
        logger.info(f"Catalogo non scansionato: {len(catalogo)}")
        
        cursor.close()
        conn.close()
        
        # ====================================================================
        # ELABORA
        # ====================================================================
        
        products_for_export = []
        
        # Scansionati
        for row in scansionati:
            product_row = {
                'nome_sessione': row['sessioni'] or '',
                'barcode': row['barcode'],
                'nome_prodotto': row['descrizione'] or row['nome_scan'] or 'N/A',
                'categoria': row['categoria'] or 'N/A',
                'quantita_sistema': float(row['quantita_magazzino'] or 0),
                'quantita_fisica': float(row['quantita_fisica'] or 0),
                'costo': float(row['costo'] or 0),
                'prezzo_pubblico': float(row['prezzo_pubblico'] or 0),
                'rilevato': True
            }
            products_for_export.append(product_row)
        
        # Catalogo
        for row in catalogo:
            product_row = {
                'nome_sessione': '',
                'barcode': row['codice_barcode'],
                'nome_prodotto': row['descrizione'] or 'N/A',
                'categoria': row['categoria'] or 'N/A',
                'quantita_sistema': float(row['quantita_magazzino'] or 0),
                'quantita_fisica': 0,
                'costo': float(row['costo'] or 0),
                'prezzo_pubblico': float(row['prezzo_pubblico'] or 0),
                'rilevato': False
            }
            products_for_export.append(product_row)
        
        logger.info(f"Totale: {len(products_for_export)}")

        # Ordinamento per Nome Sessione, Barcode
        products_for_export.sort(key=lambda p: (p.get('nome_sessione', ''), p.get('barcode', '')))

        # ====================================================================
        # EXCEL
        # ====================================================================
        
        excel_file = generate_inventory_excel(
            sede_nome=sede_nome,
            data_valorizzazione=data_valorizzazione,
            products_data=products_for_export,
            tenant_id=tenant_id
        )
        
        data_obj = datetime.strptime(data_valorizzazione, '%Y-%m-%d')
        data_formattata = data_obj.strftime('%d-%m-%Y')
        sede_slug = sede_nome.replace(' ', '_')
        filename = f"Inventario_{sede_slug}_{data_formattata}.xlsx"
        
        return send_file(
            excel_file,
            mimetype='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
            as_attachment=True,
            download_name=filename
        )
    
    except Exception as e:
        logger.error(f"Errore: {e}")
        import traceback
        traceback.print_exc()
        return jsonify({'success': False, 'error': str(e)}), 500
