/**
 * Conflict resolution helpers for StateSyncManager.
 *
 * Extracted from sync.ts to stay within the 300-LOC target.
 */

import type { SDKState, ConflictResolution } from '@breakpilot/compliance-sdk-types'

// =============================================================================
// DEFAULT CONFLICT HANDLER
// =============================================================================

/**
 * Default strategy: if local is newer, keep local; otherwise merge
 * server as the base but preserve local preferences and deduplicate
 * commandBarHistory / recentSearches.
 */
export async function defaultConflictHandler(
  local: SDKState,
  server: SDKState
): Promise<ConflictResolution> {
  const localTime = new Date(local.lastModified).getTime()
  const serverTime = new Date(server.lastModified).getTime()

  if (localTime > serverTime) {
    return { strategy: 'local' }
  }

  const mergedState: SDKState = {
    ...server,
    preferences: local.preferences,
    commandBarHistory: [
      ...local.commandBarHistory,
      ...server.commandBarHistory.filter(
        h => !local.commandBarHistory.some(lh => lh.id === h.id)
      ),
    ].slice(0, 50),
    recentSearches: [...new Set([...local.recentSearches, ...server.recentSearches])].slice(
      0,
      20
    ),
  }

  return { strategy: 'merge', mergedState }
}

// =============================================================================
// CONFLICT RESOLUTION APPLIER
// =============================================================================

/**
 * Given a resolution strategy and both states, returns the winning state.
 */
export function applyConflictResolution(
  resolution: ConflictResolution,
  localState: SDKState,
  serverState: SDKState
): SDKState {
  switch (resolution.strategy) {
    case 'local':
      return localState
    case 'server':
      return serverState
    case 'merge':
      return resolution.mergedState || localState
  }
}
