import 'server-only'

import { createAdminClient } from '@/lib/supabase/admin'
import { logOperationEvent } from '@/lib/observability/operation-events'
import { safeOperationDetail, type OperationDetail } from '@/lib/domain/operation-log'

/**
 * Purchase audit trail (task §25). One row per meaningful event in
 * purchase_events, mirrored as a compact line into operation_events
 * (area 'billing') so it shows in /admin/operations. Best effort: never throws.
 */

export type PurchaseEventName =
  | 'cart_created' | 'item_added' | 'item_removed'
  | 'purchase_submitted' | 'checkout_requested' | 'checkout_url_received' | 'customer_redirected'
  | 'payment_pending' | 'synchron_payment_verified' | 'purchase_marked_paid'
  | 'routing_item_released' | 'routing_item_completed'
  | 'payment_failed' | 'refund_reported' | 'purchase_cancelled' | 'purchase_expired'
  | 'card_setup_requested' | 'card_setup_confirmed' | 'card_use_confirmed'
  | 'permit_request_submitted' | 'synchron_api_error'
  | 'reconciliation_flagged' | 'reconciliation_run' | 'duplicate_event_ignored'

export interface PurchaseEventInput {
  event: PurchaseEventName
  purchaseId?: string | null
  purchaseItemId?: string | null
  tripId?: string | null
  actorUserId?: string | null
  actorLabel?: string | null
  sourceSystem?: 'hha' | 'synchron' | 'mock'
  synchronOrderToken?: string | null
  purchaseReference?: string | null
  externalEventId?: string | null
  outcome?: 'started' | 'success' | 'skipped' | 'failed'
  detail?: OperationDetail
}

/** Returns false when the same external event id was already recorded. */
export async function logPurchaseEvent(input: PurchaseEventInput): Promise<boolean> {
  const detail = safeOperationDetail(input.detail)
  const row = {
    purchase_id: input.purchaseId ?? null,
    purchase_item_id: input.purchaseItemId ?? null,
    trip_id: input.tripId ?? null,
    event: input.event,
    actor_user_id: input.actorUserId ?? null,
    actor_label: input.actorLabel?.slice(0, 200) ?? null,
    source_system: input.sourceSystem ?? 'hha',
    synchron_order_token: input.synchronOrderToken ?? null,
    purchase_reference: input.purchaseReference ?? null,
    external_event_id: input.externalEventId?.slice(0, 200) ?? null,
    detail,
  }
  let inserted = true
  try {
    const { error } = await createAdminClient().from('purchase_events').insert(row)
    if (error) {
      // 23505 = the partial unique index on external_event_id: a repeat delivery.
      if (error.code === '23505') inserted = false
      else console.error('purchase_events insert failed', { event: row.event, code: error.code })
    }
  } catch (error) {
    console.error('purchase_events unavailable', { event: row.event, type: error instanceof Error ? error.name : 'unknown' })
  }
  await logOperationEvent({
    area: 'billing',
    event: input.event,
    outcome: input.outcome ?? (inserted ? 'success' : 'skipped'),
    tripId: input.tripId ?? null,
    requestId: input.purchaseReference ?? null,
    detail: { ...detail, source: row.source_system, ...(input.synchronOrderToken ? { order_token: input.synchronOrderToken } : {}) },
  })
  return inserted
}
