import { join } from 'path';
import Ajv, { JSONSchemaType } from 'ajv';

import { CLI_TERSE_ERROR } from '@alwaysai/alwayscli';
import { ConfigFileSchema } from '@alwaysai/config-nodejs';
import { ALWAYSAI_CLI_EXECUTABLE_NAME } from '../../constants';
import { PROJECT_JSON_FILE_NAME } from '../../paths';

export interface ProjectConfig {
  project: {
    id: string;
    name?: string;
  };
}

export const projectConfigSchema: JSONSchemaType<ProjectConfig> = {
  type: 'object',
  properties: {
    project: {
      type: 'object',
      properties: {
        id: {
          type: 'string'
        },
        name: {
          type: 'string',
          nullable: true
        }
      },
      required: ['id']
    }
  },
  required: ['project']
};

const ajv = new Ajv();

const validateFunction = ajv.compile(projectConfigSchema);

const ENOENT = {
  message: `${PROJECT_JSON_FILE_NAME} not found. Did you run "${ALWAYSAI_CLI_EXECUTABLE_NAME} app configure"?`,
  code: CLI_TERSE_ERROR
};

export function ProjectJsonFile(dir = process.cwd()) {
  const configFile = ConfigFileSchema({
    path: join(dir, PROJECT_JSON_FILE_NAME),
    validateFunction,
    ENOENT,
    initialValue: {
      project: {
        id: '',
        name: ''
      }
    }
  });

  return {
    ...configFile,
    name: PROJECT_JSON_FILE_NAME
  };
}
