// Static constants and utility functions — no mock data.
// All runtime data comes from /api/files/list, /api/files/fetch, /api/snb.

const VERSION = '1.0.0'

const FILE_PATH_MAP = {
  SPEC:  'onboarding_activity/config/Policy/Spec',
  SET:   'onboarding_activity/config/Policy/Set',
  GROUP: 'onboarding_activity/config/Policy/Group',
  RULE:  'onboarding_activity/config/Policy/Rule',
  CFS:   'onboarding_activity/config/CFS',
  RFS:   'onboarding_activity/config/RFS',
}

const FILE_TYPES = Object.keys(FILE_PATH_MAP)
const SNB_TYPES  = ['productOffering', 'productOfferingPrices', 'productSpec', 'policyRule', 'policyEvent']

const NODE_COLORS = {
  CFS:   { border: 'var(--info-600)',    color: 'var(--info-700)' },
  RFS:   { border: 'var(--green-600)',   color: 'var(--green-700)' },
  SET:   { border: 'var(--warn-600)',    color: 'var(--warn-700)' },
  GROUP: { border: '#B45A2B',            color: '#8C3F18' },
  RULE:  { border: 'var(--danger-600)', color: 'var(--danger-700)' },
  SPEC:  { border: '#7A53B2',            color: '#5A3B8A' },
}

const DEFAULT_CONFIG = {
  commonRepo:     '',
  commonBranch:   'develop',
  activityRepo:   '',
  activityBranch: 'develop',
}

function resolveSnbPath(type, { id, param = 'productOfferingName', name, action }) {
  switch (type) {
    case 'productOffering':
      return `/snb/productOfferingManagement/v1/productOffering/${encodeURIComponent(id)}`
    case 'productOfferingPrices':
      return `/snb/productOfferingManagement/v1/productOffering/productOfferingPrices?${param}=${encodeURIComponent(name)}`
    case 'productSpec':
      return `/snb/productCatalogManagement/v1/productSpecification/${encodeURIComponent(id)}`
    case 'policyRule':
      return `/snb/policyManagement/v1/policyRule/${encodeURIComponent(id)}`
    case 'policyEvent':
      return `/snb/policyManagement/v1/policyEvent?triggerConstraints=${encodeURIComponent(name)}&triggerAction=${encodeURIComponent(action)}`
    default:
      throw new Error(`Unknown SNB type: ${type}`)
  }
}

function flattenJSON(obj, prefix = '') {
  const rows = []
  const push = (key, value) => {
    if (value === null) {
      rows.push({ key, type: 'null', value: 'null' })
    } else if (Array.isArray(value)) {
      rows.push({ key, type: 'array', value: `Array(${value.length})` })
      value.forEach((item, i) => {
        if (typeof item === 'object' && item !== null) {
          rows.push(...flattenJSON(item, `${key}[${i}]`))
        } else {
          rows.push({ key: `${key}[${i}]`, type: typeof item, value: String(item) })
        }
      })
    } else if (typeof value === 'object') {
      rows.push({ key, type: 'object', value: `Object(${Object.keys(value).length})` })
      rows.push(...flattenJSON(value, key))
    } else {
      rows.push({ key, type: typeof value, value: String(value) })
    }
  }
  for (const [k, v] of Object.entries(obj)) {
    push(prefix ? `${prefix}.${k}` : k, v)
  }
  return rows
}

Object.assign(window, { VERSION, FILE_TYPES, SNB_TYPES, NODE_COLORS, FILE_PATH_MAP, DEFAULT_CONFIG, flattenJSON, resolveSnbPath })
