#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Script para diagnosticar y corregir el problema con la orden S00029
"""

import odoo
import traceback
from datetime import date

def fix_order(cr):
    """Diagnosticar y corregir la orden S00029"""
    env = odoo.api.Environment(cr, odoo.SUPERUSER_ID, {})
    
    # Buscar la orden
    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"  Género: {order.partner_id.gender}")
    print(f"  Fecha nacimiento: {order.partner_id.birthdate_date}")
    
    # Calcular edad
    patient_age = None
    if order.partner_id.birthdate_date:
        today = date.today()
        patient_age = today.year - order.partner_id.birthdate_date.year
        if today.month < order.partner_id.birthdate_date.month or \
           (today.month == order.partner_id.birthdate_date.month and today.day < order.partner_id.birthdate_date.day):
            patient_age -= 1
        print(f"  Edad: {patient_age} años")
    
    # Buscar el parámetro problemático (Prueba de Embarazo)
    print("\n🔍 Buscando parámetros de selección problemáticos...")
    
    # Query directa para encontrar el problema
    cr.execute("""
        SELECT 
            lap.id,
            lap.name,
            lap.code,
            lap.value_type,
            lap.selection_values,
            COUNT(DISTINCT lpr.default_value_selection) as unique_defaults,
            STRING_AGG(DISTINCT lpr.default_value_selection, ', ') as default_values
        FROM lims_analysis_parameter lap
        JOIN lims_parameter_range lpr ON lpr.parameter_id = lap.id
        WHERE lap.value_type = 'selection'
        AND lpr.default_value_selection IS NOT NULL
        GROUP BY lap.id, lap.name, lap.code, lap.value_type, lap.selection_values
        HAVING COUNT(DISTINCT lpr.default_value_selection) > 1
    """)
    
    problematic = cr.fetchall()
    if problematic:
        print("\n⚠️  Parámetros con múltiples valores por defecto:")
        for p in problematic:
            print(f"  - {p[1]} (código: {p[2]})")
            print(f"    Valores posibles: {p[4]}")
            print(f"    Valores por defecto encontrados: {p[6]}")
    
    # Ver específicamente el parámetro HCG (Prueba de Embarazo)
    cr.execute("""
        SELECT 
            lpr.id,
            lpr.age_min,
            lpr.age_max,
            lpr.gender,
            lpr.default_value_selection,
            lpr.is_pregnant_specific
        FROM lims_parameter_range lpr
        JOIN lims_analysis_parameter lap ON lap.id = lpr.parameter_id
        WHERE lap.code = 'HCG'
        ORDER BY lpr.age_min, lpr.gender
    """)
    
    hcg_ranges = cr.fetchall()
    if hcg_ranges:
        print("\n📊 Rangos del parámetro HCG (Prueba de Embarazo):")
        for r in hcg_ranges:
            print(f"  - Rango ID {r[0]}: edad {r[1]}-{r[2]}, género {r[3]}, embarazo: {r[5]}, default: '{r[4]}'")
    
    # Intentar arreglar el problema
    print("\n🔧 Intentando corregir el problema...")
    
    # Opción 1: Eliminar valores por defecto conflictivos
    # Solo dejar el valor por defecto para el caso específico de embarazo
    cr.execute("""
        UPDATE lims_parameter_range
        SET default_value_selection = NULL
        WHERE parameter_id IN (
            SELECT id FROM lims_analysis_parameter WHERE code = 'HCG'
        )
        AND is_pregnant_specific = false
    """)
    
    print(f"✓ Eliminados valores por defecto de rangos no específicos de embarazo")
    
    # Verificar la corrección
    cr.execute("""
        SELECT COUNT(*)
        FROM lims_parameter_range lpr
        JOIN lims_analysis_parameter lap ON lap.id = lpr.parameter_id
        WHERE lap.code = 'HCG'
        AND lpr.default_value_selection IS NOT NULL
    """)
    
    remaining = cr.fetchone()[0]
    print(f"  Rangos con valor por defecto restantes: {remaining}")
    
    # Intentar confirmar la orden nuevamente
    print("\n🔄 Intentando confirmar la orden después de la corrección...")
    try:
        order.action_confirm()
        print("✅ ¡Orden confirmada exitosamente!")
        print(f"  Nuevo estado: {order.state}")
        print(f"  Muestras generadas: {len(order.generated_sample_ids)}")
        
        # Confirmar los cambios
        cr.commit()
        print("\n✅ Cambios guardados en la base de datos")
        
    except Exception as e:
        print(f"❌ Error al confirmar: {str(e)}")
        traceback.print_exc()
        cr.rollback()
        print("\n⚠️  Cambios revertidos")
        
        # Si sigue fallando, mostrar más información
        print("\n📋 Información adicional para debugging:")
        for line in order.order_line:
            if line.product_id.is_analysis:
                print(f"\n  Análisis: {line.product_id.name}")
                template = line.product_id.product_tmpl_id
                for param_config in template.parameter_ids:
                    print(f"    - Parámetro: {param_config.parameter_id.name}")
                    print(f"      Tipo: {param_config.parameter_value_type}")
                    if param_config.parameter_value_type == 'selection':
                        print(f"      ⚠️  Es de tipo selección")

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