import os
from celery import Celery

# Orden: PedimentoCode y RegimenPedimento antes de CodePedimentoRegimen (mapper)
from api.v1.modules.public.reference_data.pedimento_codes.models import PedimentoCode
from api.v1.modules.public.reference_data.pedimento_regimens.models import RegimenPedimento
from api.v1.modules.public.reference_data.code_pedimento_regimens.models import (
    CodePedimentoRegimen,
)
# InvoiceType debe cargarse antes de InvoiceHeader (FK invoice_header.invoice_type -> public.invoice_types.key)
from api.v1.modules.public.reference_data.invoice_types.models import InvoiceType  # noqa: F401
# CustomsSection debe cargarse antes de InvoiceComplianceMx (FK invoice_compliance_mx.aduana -> public.customs_sections.customs_code)
from api.v1.modules.public.reference_data.customs_sections.models import CustomsSection  # noqa: F401

# Import models in correct order for SQLAlchemy relationship resolution
# CRITICAL: FaLineItem must be imported BEFORE LineItem
from api.v1.modules.a24.fa.fa_item_lines.models import FaLineItem  # noqa: F401
from api.v1.modules.a76.items.models import LineItem  # noqa: F401
# CRITICAL: BalanceMovement must be loaded before DischargeDetail (FK a24.balance_movement)
from api.v1.modules.a24.balance_movements.models import BalanceMovement  # noqa: F401
from api.v1.modules.a24.discharges.models import DischargeHeader, DischargeDetail  # noqa: F401

valkey_url = os.getenv("VALKEY_URL", "redis://valkey:6379/0")
print(f"DEBUG: Celery Broker URL: {valkey_url}")

# Configurar broker y backend explícitamente en el constructor
celery_app = Celery(
    "anexo76_tasks",
    broker=valkey_url,
    backend=valkey_url,
)
celery_app.set_default()

celery_app.conf.update(
    include=[
        "api.v1.modules.a76.reports.importacion.facturas.task",
        "api.v1.modules.a76.reports.importacion.consolidados.task",
        "api.v1.modules.a76.reports.importacion.packing_list.task",
        "api.v1.modules.a76.reports.exportacion.aviso_consolidado.task",
        "api.v1.modules.a76.reports.movements.invoices.tasks",
        "api.v1.modules.a76.reports.movements.saldos.tasks",
        "api.v1.modules.a76.reports.exportacion.descargo.task",
        "api.v1.modules.a76.layouts_csv.facturas.tasks",
        "api.v1.modules.a76.layouts_csv.exportacion.tasks",
        "api.v1.modules.a76.layouts_csv.cambio_regimen_regularizacion.tasks",
        "api.v1.modules.a76.layouts_csv.customs_brokers.tasks",
        "api.v1.modules.a76.layouts_csv.clients_and_providers.tasks",
        "api.v1.modules.a76.layouts_csv.pedmientos.tasks",
        "api.v1.modules.a76.layouts_csv.exchange_rate.tasks",
        "api.v1.modules.a76.layouts_csv.us_tariff_fractions.tasks",
        "api.v1.modules.a76.layouts_csv.classes.tasks",
        "api.v1.modules.a76.layouts_csv.parts.tasks",
        "api.v1.modules.a76.layouts_csv.boms.tasks",
        "api.v1.modules.a76.layouts_csv.vehicles.tasks",
        "api.v1.modules.a76.layouts_csv.drivers.tasks",
        "api.v1.modules.a76.layouts_csv.trailers.tasks",
        "api.v1.modules.a76.layouts_csv.transportistas.tasks",
        "api.v1.modules.a76.reports.exportacion.transmission.MAINX30.task",
        "api.v1.modules.a76.reports.importacion.transmission.temporal.MAINX30.task",
        "api.v1.modules.a76.reports.importacion.transmission.definitive.MAINX30.task",
        "api.v1.modules.a76.reports.importacion.winsaai.invoices.task",
        "api.v1.modules.a76.reports.importacion.winsaai.pedimentos.task",
        "api.v1.modules.core.help_center.tasks",
        "api.v1.modules.core.help_center.tasks",
        "api.v1.modules.a76.invoices.imports.process.task",
        "api.v1.modules.a76.invoices.imports.revert.task",
        "api.v1.modules.a76.invoices.exports.process.task",
    ]  # Ruta al módulo donde están las tareas
)

# Configuraciones adicionales
celery_app.conf.update(
    task_track_started=True,
    task_serializer="json",
    accept_content=["json"],
    result_serializer="json",
    timezone="America/Mexico_City",
    enable_utc=True,
)

celery_app.conf.beat_schedule = {
    "sync-from-hub-every-minute": {
        "task": "sync_from_hub_task",
        "schedule": 60.0,  # Run every 60 seconds
    },
}

if __name__ == "__main__":
    celery_app.start()
