#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Script para investigar y confirmar la orden S00029
Error: "Para parámetros de selección solo se debe elegir una opción"
"""

import odoo
import sys
import json
import traceback

def investigate_order(cr):
    """Investigar la orden S00029 y sus detalles"""
    env = odoo.api.Environment(cr, odoo.SUPERUSER_ID, {})
    
    # Buscar la orden S00029
    order = env['sale.order'].search([('name', '=', 'S00029')], limit=1)
    if not order:
        print("❌ No se encontró la orden S00029")
        return
    
    print(f"✓ Orden encontrada: {order.name}")
    print(f"  Cliente: {order.partner_id.name}")
    print(f"  Estado: {order.state}")
    print(f"  Es solicitud de lab: {order.is_lab_request}")
    print(f"  Doctor: {order.doctor_id.name if order.doctor_id else 'N/A'}")
    print(f"  Líneas de orden: {len(order.order_line)}")
    
    # Revisar las líneas de la orden
    print("\n📋 Líneas de orden:")
    for i, line in enumerate(order.order_line, 1):
        print(f"\n  Línea {i}:")
        print(f"    Producto: {line.product_id.name}")
        print(f"    Es análisis: {line.product_id.is_analysis}")
        print(f"    Cantidad: {line.product_uom_qty}")
        
        # Verificar parámetros del análisis
        if line.product_id.is_analysis:
            params = line.product_id.parameter_ids
            print(f"    Parámetros: {len(params)}")
            
            # Ver detalles de parámetros con tipo selección
            selection_params = params.filtered(lambda p: p.value_type == 'selection')
            if selection_params:
                print(f"    ⚠️  Parámetros de selección encontrados: {len(selection_params)}")
                for param in selection_params:
                    print(f"      - {param.name} (código: {param.code})")
                    print(f"        Opciones: {param.selection_options}")
                    # Verificar si hay valores predeterminados múltiples
                    cr.execute("""
                        SELECT COUNT(*) 
                        FROM lims_parameter_range 
                        WHERE parameter_id = %s 
                        AND default_value_selection IS NOT NULL
                    """, (param.id,))
                    default_count = cr.fetchone()[0]
                    if default_count > 1:
                        print(f"        ⚠️  PROBLEMA: {default_count} valores predeterminados para este parámetro")
    
    # Intentar confirmar la orden
    print("\n🔄 Intentando confirmar la orden...")
    try:
        # Primero, verificar si hay muestras generadas
        print(f"  Muestras generadas antes: {len(order.generated_sample_ids)}")
        
        # Intentar confirmar
        order.action_confirm()
        print("✅ Orden confirmada exitosamente!")
        print(f"  Nuevo estado: {order.state}")
        print(f"  Muestras generadas después: {len(order.generated_sample_ids)}")
        
    except Exception as e:
        print(f"❌ Error al confirmar: {str(e)}")
        print("\n📊 Traceback completo:")
        traceback.print_exc()
        
        # Investigar más a fondo el error
        if "parámetros de selección" in str(e):
            print("\n🔍 Investigando parámetros de selección...")
            
            # Buscar todos los parámetros de selección en la base
            cr.execute("""
                SELECT 
                    lap.id,
                    lap.name,
                    lap.code,
                    lap.selection_options,
                    COUNT(lpr.id) as range_count,
                    COUNT(lpr.default_value_selection) as default_count
                FROM lims_analysis_parameter lap
                LEFT JOIN lims_parameter_range lpr ON lpr.parameter_id = lap.id
                WHERE lap.value_type = 'selection'
                GROUP BY lap.id, lap.name, lap.code, lap.selection_options
                HAVING COUNT(lpr.default_value_selection) > 1
            """)
            
            problematic_params = cr.fetchall()
            if problematic_params:
                print("\n⚠️  Parámetros problemáticos encontrados:")
                for param in problematic_params:
                    print(f"  - {param[1]} (código: {param[2]})")
                    print(f"    Opciones: {param[3]}")
                    print(f"    Rangos totales: {param[4]}")
                    print(f"    Valores predeterminados: {param[5]}")
                    
                    # Ver los valores predeterminados
                    cr.execute("""
                        SELECT 
                            default_value_selection,
                            age_min,
                            age_max,
                            gender
                        FROM lims_parameter_range
                        WHERE parameter_id = %s
                        AND default_value_selection IS NOT NULL
                    """, (param[0],))
                    defaults = cr.fetchall()
                    print("    Valores predeterminados por rango:")
                    for default in defaults:
                        print(f"      - '{default[0]}' para edad {default[1]}-{default[2]}, género: {default[3]}")
    
    return order

if __name__ == '__main__':
    db_name = 'lims_demo'
    try:
        registry = odoo.registry(db_name)
        with registry.cursor() as cr:
            investigate_order(cr)
    except Exception as e:
        print(f"Error general: {e}")
        traceback.print_exc()