import { NextRouter } from 'next/router';
import { ParsedUrlQuery } from 'querystring';

type UpdateQueryInput = {
  query: ParsedUrlQuery;
  params: ParsedUrlQuery;
};

type ReplaceQueryInput = {
  router: NextRouter;
  params: ParsedUrlQuery;
  newPath?: string;
};

export function updateQuery({ query, params = {} }: UpdateQueryInput) {
  Object.entries(params).forEach(([key, value]) => {
    if (key && value) {
      query[key] = value;
    } else if (key) {
      delete query[key];
    }
  });

  return query;
}

export function replaceQuery({ router, params, newPath }: ReplaceQueryInput) {
  const { query, pathname } = router;
  let p = pathname;

  Object.entries(query).forEach(([k, v]) => {
    if (p.includes(`[${k}]`)) {
      p = p.replace(`[${k}]`, v as string);
      delete query[k];
    }
  });

  return router.push({ pathname: newPath || p, query: updateQuery({ query, params }) });
}
