#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Script para agregar resultados a las pruebas ya validadas
"""

import odoo
import logging
import random

_logger = logging.getLogger(__name__)


def add_results_to_validated_tests(env):
    """Agregar resultados a pruebas ya validadas"""
    
    # Buscar las órdenes S00029 y S00030
    orders = env['sale.order'].search([('name', 'in', ['S00029', 'S00030'])], order='name')
    
    if not orders:
        print("No se encontraron las órdenes S00029 o S00030")
        return
    
    for order in orders:
        print(f"\n=== Procesando orden {order.name} ===")
        
        for test in order.lab_test_ids:
            print(f"\nPrueba: {test.product_id.name}")
            
            # Cambiar temporalmente a estado draft para poder modificar
            test.sudo().write({'state': 'draft'})
            
            # Generar resultados si no existen
            if not test.result_ids:
                test.sudo()._generate_test_results()
                print(f"  Generados {len(test.result_ids)} resultados")
            
            # Asignar valores a los resultados
            for result in test.result_ids:
                parameter = result.parameter_id
                vals = {}
                
                if parameter.value_type == 'numeric':
                    # Valores específicos por código
                    if parameter.code == 'HGB':  # Hemoglobina
                        vals['value_numeric'] = random.uniform(12.0, 16.0)
                    elif parameter.code == 'HCT':  # Hematocrito
                        vals['value_numeric'] = random.uniform(36.0, 46.0)
                    elif parameter.code == 'WBC':  # Leucocitos
                        vals['value_numeric'] = random.uniform(4.5, 10.0)
                    elif parameter.code == 'PLT':  # Plaquetas
                        vals['value_numeric'] = random.uniform(150, 400)
                    elif parameter.code == 'RBC':  # Eritrocitos
                        vals['value_numeric'] = random.uniform(4.0, 5.5)
                    elif parameter.code == 'GLU':  # Glucosa
                        vals['value_numeric'] = random.uniform(70, 110)
                    elif parameter.code == 'CHOL':  # Colesterol
                        vals['value_numeric'] = random.uniform(160, 220)
                    elif parameter.code == 'TRIG':  # Triglicéridos
                        vals['value_numeric'] = random.uniform(50, 150)
                    elif parameter.code == 'HDL':  # HDL
                        vals['value_numeric'] = random.uniform(40, 60)
                    elif parameter.code == 'LDL':  # LDL
                        vals['value_numeric'] = random.uniform(80, 130)
                    else:
                        # Valor genérico
                        vals['value_numeric'] = random.uniform(10, 100)
                    
                    print(f"    - {parameter.name}: {vals['value_numeric']:.2f}")
                
                elif parameter.value_type == 'text':
                    vals['value_text'] = "Normal"
                elif parameter.value_type == 'selection':
                    vals['value_selection'] = "normal"
                elif parameter.value_type == 'boolean':
                    vals['value_boolean'] = False
                
                # Escribir con sudo para evitar restricciones
                result.sudo().write(vals)
            
            # Volver a estado validated
            test.sudo().write({
                'state': 'validated',
                'validator_id': env.ref('base.user_admin').id,
                'validation_date': fields.Datetime.now()
            })
            
            # Agregar notas a algunas pruebas
            if 'Hemograma' in test.product_id.name:
                test.sudo().write({'notes': 'Todos los parámetros dentro de rangos normales.'})
            elif 'Lipídico' in test.product_id.name:
                test.sudo().write({'notes': 'Perfil lipídico normal. Se recomienda mantener dieta balanceada.'})
    
    print("\n✅ Resultados agregados exitosamente a todas las pruebas")
    return orders


if __name__ == '__main__':
    # Importar fields después de configurar Odoo
    from odoo import fields
    
    # Configuración
    db_name = 'lims_demo'
    
    # Conectar a Odoo
    odoo.tools.config.parse_config(['--database', db_name])
    
    # Obtener el registro de la base de datos
    registry = odoo.registry(db_name)
    
    # Crear cursor y environment
    with registry.cursor() as cr:
        env = odoo.api.Environment(cr, odoo.SUPERUSER_ID, {})
        
        try:
            # Agregar resultados a las pruebas
            orders = add_results_to_validated_tests(env)
            
            # Confirmar cambios
            cr.commit()
            
            print("\n📋 Ahora puedes probar el botón 'Imprimir Informe de Resultados' en las órdenes S00029 y S00030.")
            
        except Exception as e:
            cr.rollback()
            print(f"\n❌ Error: {str(e)}")
            _logger.error(f"Error agregando resultados: {str(e)}", exc_info=True)