/*
 * Copyright (C) Sapphirecode - All Rights Reserved
 * This file is part of console-app which is released under MIT.
 * See file 'LICENSE' for full license details.
 * Created by Timo Hocker <timo@scode.ovh>, May 2020
 */

import fs from 'fs-extra';
import { TypeValidation } from './TypeValidation';

export class PathType extends TypeValidation {
  public get string_type (): 'string'|'number'|'boolean'|'object' {
    return 'string';
  }

  public get persistent_type (): 'string'|'number'|'boolean'|'array' {
    return 'string';
  }

  public async to_type (value: unknown): Promise<unknown> {
    if (typeof value !== 'string')
      throw new Error (`invalid type for ${this.option_type}`);
    if (!await fs.pathExists (value))
      throw new Error ('path does not exist');
    if (this.option_type === 'path')
      return value;

    const stat = await fs.stat (value);
    if (stat.isDirectory () === (this.option_type === 'folder'))
      return value;

    throw new Error ('cannot assign folder to file');
  }
}