#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Script para verificar los códigos de barras de las muestras en la orden S00025
"""
import odoo
import json
from datetime import datetime

def check_order_samples(cr, order_name='S00025'):
    """Verificar las muestras y sus códigos de barras para una orden específica"""
    
    # Buscar la orden
    cr.execute("""
        SELECT id, name, state, is_lab_request
        FROM sale_order 
        WHERE name = %s
    """, (order_name,))
    
    order = cr.fetchone()
    if not order:
        print(f"❌ No se encontró la orden {order_name}")
        return
    
    print(f"✅ Orden encontrada: {order[1]}")
    print(f"   - ID: {order[0]}")
    print(f"   - Estado: {order[2]}")
    print(f"   - Es orden de lab: {order[3]}")
    print("")
    
    # Buscar las muestras asociadas a la orden
    cr.execute("""
        SELECT 
            sl.id,
            sl.name,
            sl.barcode,
            sl.is_lab_sample,
            sl.patient_id,
            sl.collection_date,
            sl.state,
            sl.sample_type_product_id,
            rp.name as patient_name
        FROM stock_lot sl
        LEFT JOIN res_partner rp ON sl.patient_id = rp.id
        WHERE sl.id IN (
            SELECT lot_id 
            FROM sale_order_stock_lot_rel 
            WHERE order_id = %s
        )
    """, (order[0],))
    
    samples = cr.fetchall()
    
    if not samples:
        print(f"❌ No se encontraron muestras para la orden {order_name}")
        
        # Verificar si hay relación en la tabla intermedia
        cr.execute("""
            SELECT COUNT(*) 
            FROM sale_order_stock_lot_rel 
            WHERE order_id = %s
        """, (order[0],))
        count = cr.fetchone()[0]
        print(f"   Registros en sale_order_stock_lot_rel: {count}")
        return
    
    print(f"📋 Muestras encontradas: {len(samples)}")
    print("-" * 80)
    
    for sample in samples:
        print(f"Muestra ID: {sample[0]}")
        print(f"  - Nombre: {sample[1]}")
        print(f"  - Código de barras: {sample[2] or '❌ VACÍO'}")
        print(f"  - Es muestra de lab: {sample[3]}")
        print(f"  - Paciente: {sample[8]} (ID: {sample[4]})")
        print(f"  - Fecha recolección: {sample[5]}")
        print(f"  - Estado: {sample[6]}")
        print(f"  - Tipo muestra ID: {sample[7]}")
        
        # Si no tiene código de barras, generar uno de ejemplo
        if not sample[2]:
            print(f"  ⚠️  FALTA CÓDIGO DE BARRAS - Ejemplo generado: {datetime.now().strftime('%y%m%d')}000001")
        
        print("-" * 40)
    
    # Verificar el campo generated_sample_ids
    cr.execute("""
        SELECT COUNT(*)
        FROM sale_order_stock_lot_rel
        WHERE order_id = %s
    """, (order[0],))
    
    rel_count = cr.fetchone()[0]
    print(f"\n📊 Resumen:")
    print(f"   - Total muestras en relación: {rel_count}")
    print(f"   - Muestras sin código de barras: {sum(1 for s in samples if not s[2])}")
    
    # Verificar si el campo barcode es calculado o almacenado
    cr.execute("""
        SELECT 
            column_name,
            data_type,
            is_nullable,
            column_default
        FROM information_schema.columns
        WHERE table_name = 'stock_lot'
        AND column_name = 'barcode'
    """)
    
    col_info = cr.fetchone()
    if col_info:
        print(f"\n🔍 Información del campo 'barcode':")
        print(f"   - Tipo de dato: {col_info[1]}")
        print(f"   - Permite NULL: {col_info[2]}")
        print(f"   - Valor por defecto: {col_info[3]}")

if __name__ == '__main__':
    print("🔍 Verificando códigos de barras para orden S00025...")
    print("=" * 80)
    
    db_name = 'lims_demo'
    try:
        registry = odoo.registry(db_name)
        with registry.cursor() as cr:
            check_order_samples(cr, 'S00025')
    except Exception as e:
        print(f"❌ Error: {str(e)}")
        print("   Asegúrate de ejecutar este script dentro del contenedor de Odoo")