import { URI as Uri } from 'vscode-uri';
import URI from '@theia/core/lib/common/uri';
import { toPosixPath, parentPosix, posix } from './create-paths';
import { Create } from './typings';

export namespace CreateUri {
  export const scheme = 'arduino-create';
  export const root = toUri(posix.sep);

  export function toUri(
    posixPathOrResource: string | Create.Resource | Create.Sketch
  ): URI {
    const posixPath =
      typeof posixPathOrResource === 'string'
        ? posixPathOrResource
        : toPosixPath(posixPathOrResource.path);
    return new URI(Uri.parse(posixPath).with({ scheme, authority: 'create' }));
  }

  export function is(uri: URI): boolean {
    return uri.scheme === scheme;
  }

  export function equals(left: URI, right: URI): boolean {
    return is(left) && is(right) && left.toString() === right.toString();
  }

  export function parent(uri: URI): URI {
    if (!is(uri)) {
      throw new Error(
        `Invalid URI scheme. Expected '${scheme}' got '${uri.scheme}' instead.`
      );
    }
    if (equals(uri, root)) {
      return uri;
    }
    return toUri(parentPosix(uri.path.toString()));
  }
}