#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Script de limpieza completa de datos de prueba en Odoo / Hazard.
Elimina en el orden correcto respetando FK constraints:
  1. Facturas borrador vinculadas a pedidos Shopify
  2. Entregas/Pickings vinculadas a pedidos Shopify
  3. Pedidos de venta de Shopify
  4. Productos importados planos (1 por variante)
  5. Contactos falsos "Cliente Shopify #XXXX"

Ejecutar con:
  docker exec -it odoo-16-hazard-new odoo shell -d hazard_new --no-http < /mnt/extra-addons/cleanup_shopify_data.py
"""

import logging
_logger = logging.getLogger(__name__)

print("=" * 60)
print("LIMPIEZA DE DATOS DE PRUEBA — HAZARD")
print("=" * 60)

# ─────────────────────────────────────────────────────────────
# PASO 1: Facturas borrador vinculadas a pedidos Shopify
# ─────────────────────────────────────────────────────────────
print("\n[1/5] Buscando facturas borrador de pedidos Shopify...")

shopify_orders = env['sale.order'].search([('shopify_order_id', '!=', False)])
print(f"      → {len(shopify_orders)} pedidos de Shopify encontrados")

invoices = shopify_orders.mapped('invoice_ids').filtered(lambda i: i.state in ('draft', 'cancel'))
print(f"      → {len(invoices)} facturas borrador/canceladas a eliminar")

cancelled = 0
for inv in invoices:
    try:
        with env.cr.savepoint():
            if inv.state == 'draft':
                inv.button_cancel()
            inv.unlink()
        cancelled += 1
    except Exception as e:
        print(f"      ⚠️  No se pudo eliminar factura {inv.name}: {e}")

env.cr.commit()
print(f"      ✅ {cancelled} facturas eliminadas")

# ─────────────────────────────────────────────────────────────
# PASO 2: Pickings / Entregas vinculadas a pedidos Shopify
# ─────────────────────────────────────────────────────────────
print("\n[2/5] Eliminando entregas/pickings de pedidos Shopify...")

pickings = shopify_orders.mapped('picking_ids')
print(f"      → {len(pickings)} pickings a eliminar")

deleted_pickings = 0
for picking in pickings:
    try:
        with env.cr.savepoint():
            if picking.state not in ('done', 'cancel'):
                picking.action_cancel()
            if picking.state == 'cancel':
                picking.unlink()
                deleted_pickings += 1
            elif picking.state == 'done':
                # Picking ya procesado — no se puede borrar, solo informamos
                print(f"      ⚠️  Picking {picking.name} ya validado (done), no se puede eliminar")
    except Exception as e:
        print(f"      ⚠️  Error en picking {picking.name}: {e}")

env.cr.commit()
print(f"      ✅ {deleted_pickings} pickings eliminados")

# ─────────────────────────────────────────────────────────────
# PASO 3: Pedidos de venta de Shopify
# ─────────────────────────────────────────────────────────────
print("\n[3/5] Eliminando pedidos de venta de Shopify...")

# Recargar por si cambiaron las relaciones
shopify_orders = env['sale.order'].search([('shopify_order_id', '!=', False)])
print(f"      → {len(shopify_orders)} pedidos a eliminar")

deleted_orders = 0
for order in shopify_orders:
    try:
        with env.cr.savepoint():
            if order.state not in ('draft', 'cancel'):
                try:
                    order.action_cancel()
                except Exception as cancel_e:
                    print(f"      ⚠️  Aviso: No se pudo cancelar el pedido {order.name}: {cancel_e}")
            # Solo intentamos borrar si no está 'done' o si se pudo cancelar
            if order.state in ('draft', 'cancel'):
                order.unlink()
                deleted_orders += 1
            else:
                print(f"      ⚠️  Pedido {order.name} en estado {order.state}, no se puede eliminar")
    except Exception as e:
        print(f"      ⚠️  No se pudo eliminar pedido {order.name}: {e}")

env.cr.commit()
print(f"      ✅ {deleted_orders} pedidos eliminados")

# ─────────────────────────────────────────────────────────────
# PASO 4: Productos importados planos de Shopify
# ─────────────────────────────────────────────────────────────
print("\n[4/5] Eliminando productos planos importados de Shopify...")

templates_to_delete = env['product.template'].search([])

# Excluir productos del sistema que no deben borrarse
system_skus = ['ENVIO', 'SHOPIFY-GENERIC']
templates_to_delete = templates_to_delete.filtered(
    lambda t: t.default_code not in system_skus
)

print(f"      → {len(templates_to_delete)} product templates a eliminar")

deleted_products = 0
errors_products = 0
for tmpl in templates_to_delete:
    try:
        with env.cr.savepoint():
            tmpl.unlink()
        deleted_products += 1
    except Exception as e:
        # Si tiene dependencias (stock moves done, etc.) archivamos en lugar de borrar
        try:
            with env.cr.savepoint():
                tmpl.write({'active': False})
            print(f"      ℹ️  Producto '{tmpl.name[:40]}' archivado (no se pudo eliminar)")
        except Exception as e2:
            print(f"      ⚠️  Error al archivar '{tmpl.name[:40]}'")
            errors_products += 1

env.cr.commit()
print(f"      ✅ {deleted_products} productos eliminados, {errors_products} errores")

# ─────────────────────────────────────────────────────────────
# PASO 5: Contactos (OMITIDO A PETICIÓN DEL USUARIO)
# ─────────────────────────────────────────────────────────────
print("\n[5/5] Eliminando contactos... (OMITIDO)")

# ─────────────────────────────────────────────────────────────
# RESUMEN FINAL
# ─────────────────────────────────────────────────────────────
print("\n" + "=" * 60)
print("LIMPIEZA COMPLETADA")
print("=" * 60)

# Verificación
remaining_orders   = env['sale.order'].search_count([('shopify_order_id', '!=', False)])
remaining_products = env['product.template'].search_count([])
remaining_contacts = env['res.partner'].search_count([('name', 'ilike', 'Cliente Shopify #')])

print(f"✅ Pedidos Shopify restantes:    {remaining_orders}")
print(f"✅ Productos restantes en Odoo:  {remaining_products}")
print(f"✅ Contactos 'Shopify #' restantes: {remaining_contacts}")
print("\nListo para reimportar productos con la estructura correcta.")
