from odoo import api, fields, models


class RelsumTechnicalReport(models.Model):
    """Informe técnico — código NNN<I/R/A/V>-AAAA.

    Cada OT puede generar 1 o varios informes técnicos a lo largo del
    proceso (instalación, reparación, asistencia, vibraciones).
    """
    _name = 'relsum.technical.report'
    _description = 'Informe técnico'
    _inherit = ['mail.thread', 'mail.activity.mixin']
    _order = 'date desc, name desc'

    # =========================
    # CODIFICACIÓN
    # =========================

    name = fields.Char(
        string='Código',
        compute='_compute_name',
        store=True,
        index=True,
        help='Formato: NNN<tipo>-AAAA — ej. 024I-2025'
    )

    report_type = fields.Selection(
        [
            ('I', 'Inspección'),
            ('R', 'Revisión'),
            ('A', 'Aislamiento'),
            ('V', 'Vibraciones'),
        ],
        string='Tipo',
        required=True,
        default='R',
        tracking=True,
    )
    sequence_number = fields.Integer(
        string='Nº',
        required=True,
        default=0,
        help='Se calcula automáticamente al crear (siguiente número '
             'libre para el par tipo+año).',
    )
    year = fields.Integer(
        string='Año',
        required=True,
        default=lambda s: fields.Date.today().year,
    )

    date_completion = fields.Date(
        string='Fecha de finalización',
        tracking=True,
        help='Fecha en que se finalizó el trabajo en campo.',
    )
    date = fields.Date(
        string='Fecha del informe',
        default=fields.Date.context_today,
        tracking=True,
    )
    days_to_report = fields.Integer(
        string='Días hasta informe',
        compute='_compute_days_to_report',
        store=True,
        help='Días entre la finalización del trabajo y la emisión del informe.',
    )

    # =========================
    # RELACIONES
    # =========================

    repair_order_id = fields.Many2one(
        'repair.order',
        string='Orden de Trabajo',
        index=True,
        ondelete='set null',
        tracking=True,
    )
    machine_id = fields.Many2one(
        'relsum.machine',
        string='Máquina',
        related='repair_order_id.relsum_machine_id',
        store=True,
        readonly=True,
    )
    partner_id = fields.Many2one(
        'res.partner',
        string='Cliente',
        related='repair_order_id.partner_id',
        store=True,
        readonly=True,
    )

    # =========================
    # CONTENIDO
    # =========================

    notes = fields.Html(string='Contenido / hallazgos')

    # =========================
    # COMPUTES
    # =========================

    @api.depends('sequence_number', 'report_type', 'year')
    def _compute_name(self):
        for rec in self:
            if rec.sequence_number and rec.report_type and rec.year:
                rec.name = '%03d%s-%s' % (
                    rec.sequence_number, rec.report_type, rec.year,
                )
            else:
                rec.name = '(sin código)'

    @api.depends('date', 'date_completion')
    def _compute_days_to_report(self):
        for rec in self:
            if rec.date and rec.date_completion:
                rec.days_to_report = (rec.date - rec.date_completion).days
            else:
                rec.days_to_report = 0

    # =========================
    # Auto-secuencia por par (year, report_type)
    # =========================

    @api.model_create_multi
    def create(self, vals_list):
        for vals in vals_list:
            if not vals.get('sequence_number'):
                year = vals.get('year') or fields.Date.today().year
                rtype = vals.get('report_type') or 'R'
                self.env.cr.execute(
                    """SELECT COALESCE(MAX(sequence_number), 0) + 1
                       FROM relsum_technical_report
                       WHERE year = %s AND report_type = %s""",
                    (year, rtype),
                )
                vals['sequence_number'] = self.env.cr.fetchone()[0]
        return super().create(vals_list)
