from odoo import api, fields, models


class SaleOrder(models.Model):
    _inherit = 'sale.order'

    # =========================
    # OT RELACIONADA
    # =========================

    repair_order_id = fields.Many2one(
        'repair.order',
        string='Orden de Trabajo',
        readonly=True,
        copy=False,
        index=True,
    )

    # =========================
    # SECUENCIA PRE-AAAA-NNNN
    # Sobrescribimos el name al crear si el usuario no especificó otro.
    # Los presupuestos legacy mantienen su name original (NNN-AAAA).
    # =========================

    @api.model_create_multi
    def create(self, vals_list):
        for vals in vals_list:
            if not vals.get('name') or vals.get('name') == '/':
                seq = self.env['ir.sequence'].next_by_code('sale.order.pre')
                if seq:
                    vals['name'] = seq
        return super().create(vals_list)

    # =========================
    # CREAR / ABRIR OT
    # =========================

    def action_create_ot(self):

        self.ensure_one()

        # SI YA EXISTE OT
        if self.repair_order_id:

            return {
                'type': 'ir.actions.act_window',
                'res_model': 'repair.order',
                'view_mode': 'form',
                'res_id': self.repair_order_id.id,
                'target': 'current',
            }

        # CREAR OT
        repair_order = self.env['repair.order'].create({

            'partner_id': self.partner_id.id,

            # RELACIÓN PRINCIPAL
            'sale_order_id': self.id,

            # HISTÓRICO / MANY2MANY
            'sale_order_ids': [(4, self.id)],

        })

        # RELACIÓN INVERSA
        self.repair_order_id = repair_order.id

        return {
            'type': 'ir.actions.act_window',
            'res_model': 'repair.order',
            'view_mode': 'form',
            'res_id': repair_order.id,
            'target': 'current',
        }

    # =========================
    # CONFIRMAR PEDIDO
    # AUTO-LINK PICKINGS A LA OT (sólo si la OT está vinculada y sólo en
    # pickings de salida — los de devolución/retorno se ignoran)
    # =========================

    def action_confirm(self):

        result = super().action_confirm()

        for order in self:

            if not order.repair_order_id:
                continue

            for picking in order.picking_ids:

                # Sólo pickings outgoing (a cliente)
                if picking.picking_type_id.code != 'outgoing':
                    continue

                if not picking.repair_order_id:
                    picking.repair_order_id = order.repair_order_id.id

                # Sólo marcamos tipo_albaran si está vacío para no sobreescribir
                if not picking.tipo_albaran:
                    picking.tipo_albaran = 'repair'

        return result
