export type ConditionType =
  | 'eq' | 'neq' | 'gt' | 'gteq' | 'lt' | 'lteq' | 'like' | 'nlike' | 'in' | 'nin' | 'null' | 'notnull' | 'from' | 'to' | 'finset'

export interface Filter {
  field: string
  value: string | number | Array<string | number>
  condition?: ConditionType
}

export interface SearchCriteria {
  /** Filters inside one inner array are OR-ed; the groups are AND-ed (Magento semantics). */
  filterGroups?: Filter[][]
  sortOrders?: Array<{ field: string; direction: 'ASC' | 'DESC' }>
  pageSize?: number
  currentPage?: number
}

export type QueryParams = Record<string, string | number>

/** Serialise a search criteria object to Magento's bracketed query-string format. */
export function toQuery(criteria: SearchCriteria = {}): QueryParams {
  const q: QueryParams = {}
  criteria.filterGroups?.forEach((group, g) => {
    group.forEach((f, i) => {
      const prefix = `searchCriteria[filterGroups][${g}][filters][${i}]`
      q[`${prefix}[field]`] = f.field
      q[`${prefix}[value]`] = Array.isArray(f.value) ? f.value.join(',') : f.value
      q[`${prefix}[conditionType]`] = f.condition ?? 'eq'
    })
  })
  criteria.sortOrders?.forEach((s, i) => {
    q[`searchCriteria[sortOrders][${i}][field]`] = s.field
    q[`searchCriteria[sortOrders][${i}][direction]`] = s.direction
  })
  // Magento rejects list endpoints without searchCriteria; pageSize alone satisfies it.
  q['searchCriteria[pageSize]'] = criteria.pageSize ?? 100
  if (criteria.currentPage) q['searchCriteria[currentPage]'] = criteria.currentPage
  return q
}

/** AND-combine simple equality/condition filters (one filter per group). */
export function and(...filters: Array<Filter | undefined | false>): Filter[][] {
  return filters.filter((f): f is Filter => Boolean(f)).map(f => [f])
}
