import type { UrlCodec } from '@/lib/url/useUrlFilterState';

export type TmReviewFilter = 'low-quality' | 'most-reused' | 'recent';

const VALID_FILTERS = new Set<TmReviewFilter>(['low-quality', 'most-reused', 'recent']);
const DEFAULT_FILTER: TmReviewFilter = 'recent';

export interface TmReviewUrlState extends Record<string, unknown> {
  filter: TmReviewFilter;
}

function parseFilter(raw: string | null): TmReviewFilter {
  if (raw && VALID_FILTERS.has(raw as TmReviewFilter)) return raw as TmReviewFilter;
  return DEFAULT_FILTER;
}

export function makeTmReviewCodec(basePath: string): UrlCodec<TmReviewUrlState> {
  return {
    parse(loc) {
      const sp = new URLSearchParams(loc.search);
      return { filter: parseFilter(sp.get('filter')) };
    },

    build(state) {
      const sp = new URLSearchParams();
      if (state.filter !== DEFAULT_FILTER) sp.set('filter', state.filter);
      const qs = sp.toString();
      return qs ? `${basePath}?${qs}` : basePath;
    },
  };
}
