# -*- coding: utf-8 -*-
import odoo
from datetime import datetime, timedelta

def create_test_demo_data(cr):
    """Crea datos de demostración para lims.test y lims.result"""
    env = odoo.api.Environment(cr, odoo.SUPERUSER_ID, {})
    
    # Buscar algunos pacientes y análisis existentes
    patients = env['res.partner'].search([('is_patient', '=', True)], limit=3)
    if not patients:
        print("No se encontraron pacientes para crear pruebas de demostración")
        return
    
    # Buscar análisis disponibles
    hemograma = env.ref('lims_management.analysis_hemograma', raise_if_not_found=False)
    glucosa = env.ref('lims_management.analysis_glucosa', raise_if_not_found=False)
    
    if not hemograma or not glucosa:
        print("No se encontraron análisis de demostración")
        return
    
    # Buscar o crear una orden de laboratorio simple
    lab_order = env['sale.order'].search([
        ('is_lab_request', '=', True),
        ('state', '=', 'sale')
    ], limit=1)
    
    if not lab_order:
        # Crear una orden básica si no existe
        lab_order = env['sale.order'].create({
            'partner_id': patients[0].id,
            'is_lab_request': True,
            'order_line': [(0, 0, {
                'product_id': hemograma.product_variant_id.id,
                'product_uom_qty': 1
            }), (0, 0, {
                'product_id': glucosa.product_variant_id.id,
                'product_uom_qty': 1
            })]
        })
        lab_order.action_confirm()
    
    # Obtener las líneas de orden
    order_lines = lab_order.order_line
    if not order_lines:
        print("No se encontraron líneas de orden")
        return
    
    # Buscar muestras existentes
    samples = env['stock.lot'].search([
        ('is_lab_sample', '=', True),
        ('patient_id', '=', lab_order.partner_id.id)
    ], limit=2)
    
    if not samples:
        print("No se encontraron muestras de laboratorio")
        return
    
    # Crear prueba 1: Hemograma en proceso
    test1 = env['lims.test'].create({
        'sale_order_line_id': order_lines[0].id,
        'sample_id': samples[0].id,
        'state': 'draft'
    })
    
    # Iniciar proceso
    test1.action_start_process()
    
    # Crear resultados para hemograma
    results_data = [
        {
            'test_id': test1.id,
            'parameter_name': 'Glóbulos Rojos',
            'sequence': 10,
            'value_numeric': 4.5,
            'unit': '10^6/µL',
            'normal_min': 4.2,
            'normal_max': 5.4
        },
        {
            'test_id': test1.id,
            'parameter_name': 'Glóbulos Blancos',
            'sequence': 20,
            'value_numeric': 12.5,  # Fuera de rango
            'unit': '10^3/µL',
            'normal_min': 4.5,
            'normal_max': 11.0,
            'notes': 'Valor elevado - posible infección'
        },
        {
            'test_id': test1.id,
            'parameter_name': 'Hemoglobina',
            'sequence': 30,
            'value_numeric': 14.2,
            'unit': 'g/dL',
            'normal_min': 12.0,
            'normal_max': 16.0
        },
        {
            'test_id': test1.id,
            'parameter_name': 'Plaquetas',
            'sequence': 40,
            'value_numeric': 250,
            'unit': '10^3/µL',
            'normal_min': 150,
            'normal_max': 400
        }
    ]
    
    for result_data in results_data:
        env['lims.result'].create(result_data)
    
    print(f"Creada prueba {test1.name} con 4 resultados")
    
    # Crear prueba 2: Glucosa con resultado ingresado
    if len(order_lines) > 1:
        test2 = env['lims.test'].create({
            'sale_order_line_id': order_lines[1].id,
            'sample_id': samples[0].id,
            'state': 'draft'
        })
        
        test2.action_start_process()
        
        # Crear resultado de glucosa
        env['lims.result'].create({
            'test_id': test2.id,
            'parameter_name': 'Glucosa en Ayunas',
            'sequence': 10,
            'value_numeric': 125,  # Fuera de rango
            'unit': 'mg/dL',
            'normal_min': 70,
            'normal_max': 110,
            'notes': 'Valor elevado - prediabetes'
        })
        
        # Marcar resultados como ingresados
        test2.action_enter_results()
        
        print(f"Creada prueba {test2.name} con resultado ingresado")
    
    # Crear prueba 3: Uroanálisis con valores mixtos (si hay más pacientes)
    if len(patients) > 1 and len(samples) > 1:
        # Crear una orden adicional
        urine_analysis = env['product.template'].search([
            ('is_analysis', '=', True),
            ('name', 'ilike', 'orina')
        ], limit=1)
        
        if urine_analysis:
            lab_order2 = env['sale.order'].create({
                'partner_id': patients[1].id,
                'is_lab_request': True,
                'order_line': [(0, 0, {
                    'product_id': urine_analysis.product_variant_id.id,
                    'product_uom_qty': 1
                })]
            })
            lab_order2.action_confirm()
            
            test3 = env['lims.test'].create({
                'sale_order_line_id': lab_order2.order_line[0].id,
                'sample_id': samples[1].id,
                'state': 'draft'
            })
            
            test3.action_start_process()
            
            # Crear resultados mixtos
            urine_results = [
                {
                    'test_id': test3.id,
                    'parameter_name': 'Color',
                    'sequence': 10,
                    'value_text': 'Amarillo claro'
                },
                {
                    'test_id': test3.id,
                    'parameter_name': 'pH',
                    'sequence': 20,
                    'value_numeric': 6.5,
                    'normal_min': 4.6,
                    'normal_max': 8.0
                },
                {
                    'test_id': test3.id,
                    'parameter_name': 'Densidad',
                    'sequence': 30,
                    'value_numeric': 1.020,
                    'normal_min': 1.005,
                    'normal_max': 1.030
                },
                {
                    'test_id': test3.id,
                    'parameter_name': 'Proteínas',
                    'sequence': 40,
                    'value_text': 'Negativo'
                },
                {
                    'test_id': test3.id,
                    'parameter_name': 'Glucosa',
                    'sequence': 50,
                    'value_text': 'Negativo'
                }
            ]
            
            for result_data in urine_results:
                env['lims.result'].create(result_data)
            
            # Ingresar y validar resultados
            test3.action_enter_results()
            if test3.state == 'result_entered':
                test3.action_validate()
            
            print(f"Creada prueba {test3.name} validada con resultados mixtos")
    
    print("\nDatos de demostración de pruebas creados exitosamente")

if __name__ == '__main__':
    db_name = 'lims_demo'
    registry = odoo.registry(db_name)
    with registry.cursor() as cr:
        create_test_demo_data(cr)
        cr.commit()