import path from 'path';
import { createDebugger } from '@modern-js/utils';
import { Plugin as RollupPlugin } from 'rollup';
import resolve from 'enhanced-resolve';
import { IAppContext, NormalizedConfig } from '@modern-js/core';
import { DEFAULT_EXTENSIONS, BARE_SPECIFIER_REGEX } from '../constants';

const debug = createDebugger('esm:resolve');

const resolveExtensions = resolve.create.sync({
  extensions: DEFAULT_EXTENSIONS,
  symlinks: true,
});

export const resolvePlugin = (
  _config: NormalizedConfig,
  { appDirectory }: IAppContext,
): RollupPlugin => ({
  name: 'esm-resolve-extensions',
  resolveId(id, importer = appDirectory) {
    // relative imports( starts with '.')
    if (id.startsWith('.') || BARE_SPECIFIER_REGEX.test(id)) {
      const resolved = resolveExtensions(importer, id);
      debug(`resolve id: ${id} -> ${resolved.toString()}`);

      if (resolved) {
        return resolved;
      }
    }

    // absolute url path
    if (path.isAbsolute(id)) {
      let resolved: string | false = false;
      try {
        // try resolve absolute fs path
        resolved = resolveExtensions(importer, id);
      } catch (err) {
        // resolve path based on importer
        resolved = resolveExtensions(importer, `.${id}`);
      }

      debug(`resolve id: ${id} -> ${resolved.toString()}`);

      if (resolved) {
        return resolved;
      }
    }
  },
});
