# -*- coding: utf-8 -*-
from odoo import models, fields, api
from odoo.exceptions import ValidationError


class ProductTemplateParameter(models.Model):
    _name = 'product.template.parameter'
    _description = 'Parámetros por Análisis'
    _order = 'product_tmpl_id, sequence, id'
    _rec_name = 'parameter_id'

    product_tmpl_id = fields.Many2one(
        'product.template',
        string='Análisis',
        required=True,
        ondelete='cascade',
        domain=[('is_analysis', '=', True)],
        help='Análisis al que pertenece este parámetro'
    )
    
    parameter_id = fields.Many2one(
        'lims.analysis.parameter',
        string='Parámetro',
        required=True,
        ondelete='restrict',
        help='Parámetro de laboratorio'
    )
    
    sequence = fields.Integer(
        string='Secuencia',
        default=10,
        help='Orden en que aparecerá el parámetro en los resultados'
    )
    
    required = fields.Boolean(
        string='Obligatorio',
        default=True,
        help='Si está marcado, este parámetro debe tener un valor en los resultados'
    )
    
    instructions = fields.Text(
        string='Instrucciones específicas',
        help='Instrucciones especiales para este parámetro en este análisis'
    )
    
    # Campos relacionados para facilitar búsquedas y vistas
    parameter_name = fields.Char(
        related='parameter_id.name',
        string='Nombre del Parámetro',
        store=True,
        readonly=True
    )
    
    parameter_code = fields.Char(
        related='parameter_id.code',
        string='Código',
        store=True,
        readonly=True
    )
    
    parameter_value_type = fields.Selection(
        related='parameter_id.value_type',
        string='Tipo de Valor',
        store=True,
        readonly=True
    )
    
    parameter_unit = fields.Char(
        related='parameter_id.unit',
        string='Unidad',
        readonly=True
    )
    
    _sql_constraints = [
        ('unique_param_per_analysis', 
         'UNIQUE(product_tmpl_id, parameter_id)', 
         'El parámetro ya está configurado para este análisis. Cada parámetro solo puede aparecer una vez por análisis.')
    ]
    
    @api.constrains('sequence')
    def _check_sequence(self):
        for record in self:
            if record.sequence < 0:
                raise ValidationError('La secuencia debe ser un número positivo.')
    
    def name_get(self):
        result = []
        for record in self:
            name = f"{record.product_tmpl_id.name} - [{record.parameter_code}] {record.parameter_name}"
            if record.parameter_unit:
                name += f" ({record.parameter_unit})"
            result.append((record.id, name))
        return result
    
    @api.model
    def create(self, vals):
        # Si no se especifica secuencia, asignar la siguiente disponible
        if 'sequence' not in vals and 'product_tmpl_id' in vals:
            max_sequence = self.search([
                ('product_tmpl_id', '=', vals['product_tmpl_id'])
            ], order='sequence desc', limit=1).sequence
            vals['sequence'] = (max_sequence or 0) + 10
        return super(ProductTemplateParameter, self).create(vals)
    
    def copy_data(self, default=None):
        default = dict(default or {})
        # Al duplicar, incrementar la secuencia
        default['sequence'] = self.sequence + 10
        return super(ProductTemplateParameter, self).copy_data(default)