import {
  CITY_DEFINITIONS,
  SERVICE_AREA_COORDINATES,
  SERVICE_AREA_LABELS,
  SERVICE_AREA_VALUES,
  cityLabelsForBrowseArea,
  isEntireRegion,
  isShowAllBrowseArea,
  parseServiceArea,
  serviceAreasForFilter,
  WORKER_SELECTABLE_SERVICE_AREAS,
  type ServiceArea,
} from '@ehandyhire/shared';

export function resolveAreaParam(...params: unknown[]): ServiceArea | null {
  for (const param of params) {
    if (param == null || param === '') continue;
    const area = parseServiceArea(String(param));
    if (area) return area;
  }
  return null;
}

export function workerServiceAreaFilter(areaParam: unknown) {
  const area = resolveAreaParam(areaParam);
  if (isShowAllBrowseArea(area)) return undefined;
  return {
    some: {
      area: { in: serviceAreasForFilter(area!) },
    },
  };
}

/** Job `where` fragment for location matching a browse area (city or region-wide). */
export function jobLocationWhereForArea(area: ServiceArea): Record<string, unknown> {
  if (isEntireRegion(area)) {
    const labels = cityLabelsForBrowseArea(area);
    return {
      OR: labels.map((label) => ({ location: { contains: label } })),
    };
  }
  return { location: { contains: SERVICE_AREA_LABELS[area] } };
}

/** Top-level job `where` clause for browse area (used by jobs list). */
export function jobAreaWhereClause(areaParam: unknown): Record<string, unknown> | undefined {
  const area = resolveAreaParam(areaParam);
  if (isShowAllBrowseArea(area) || !area) return undefined;
  return jobLocationWhereForArea(area);
}

/** @deprecated Use jobAreaWhereClause — kept for single-city location filter shape */
export function jobLocationAreaFilter(areaParam: unknown) {
  const area = resolveAreaParam(areaParam);
  if (isShowAllBrowseArea(area) || !area) return undefined;
  if (isEntireRegion(area)) return undefined;
  return { contains: SERVICE_AREA_LABELS[area] };
}

/** Filter for counting workers with a skill in a given browse region. */
export function categoryWorkerSkillCountFilter(areaParam: unknown) {
  const area = resolveAreaParam(areaParam);
  const workerFilter: Record<string, unknown> = {
    deletedAt: null,
    isAvailable: true,
    isVerified: true,
  };
  if (!isShowAllBrowseArea(area) && area) {
    workerFilter.serviceAreas = {
      some: {
        area: { in: serviceAreasForFilter(area) },
      },
    };
  }
  return { worker: workerFilter };
}

/** Filter for counting open jobs in a given browse region. */
export function categoryJobCountFilter(areaParam: unknown) {
  const area = resolveAreaParam(areaParam);
  const base = { deletedAt: null, status: 'OPEN' as const };
  if (isShowAllBrowseArea(area) || !area) return base;
  return { ...base, ...jobLocationWhereForArea(area) };
}

export {
  CITY_DEFINITIONS,
  SERVICE_AREA_COORDINATES,
  SERVICE_AREA_LABELS,
  SERVICE_AREA_VALUES,
  WORKER_SELECTABLE_SERVICE_AREAS,
  cityLabelsForBrowseArea,
  isEntireRegion,
  isShowAllBrowseArea,
  parseServiceArea,
  serviceAreasForFilter,
  type ServiceArea,
};
