/**
* Copyright Super iPaaS Integration LLC, an IBM Company 2024
*/
import { BaseAsset } from '@apic/studio-client-model';
import { AppConstants } from '../constants/app.constants.js';
import TypeNotFoundException from '../exeptions/type-not-found-exception.js';
import { getBaseAsset, isBaseAsset } from './asset.helper.js';
import { isJSON, parseJSON } from './json.helper.js';
import { isOpenAPI } from './open-api.helper.js';
import { isSwagger } from './swagger-api.helper.js';
import { isYAML, loadYaml } from './yaml.helper.js';
import * as yaml from 'js-yaml';

export function getDocumentBasedOnLanguage(fileContent: string, language: string) {
	try {
		if ((language === 'yaml') || (language === 'yml')) {
			return loadYaml(fileContent);
		} else if (language === 'json') {
			return parseJSON(fileContent);
		} else {
			return undefined;
		}
	} catch (error) {
		console.error(error);
	}
	return undefined;
}

export function getType(data: object | string, language: string) {
	let type = undefined;
	if (isOpenAPI(data as string, language) || isSwagger(data as string, language)) {
		type = 'rest';
	} else if (isBaseAsset(data as string, language)) {
		type = 'asset';
	} else {
		return new TypeNotFoundException(AppConstants.TYPE_NOT_FOUND_EXCEPTION, 404);
	}
	return type;
}

export function getBaseKind(data: object | string, language: string) {
	if (isOpenAPI(data as string, language)) {
		return 'openapi';
	} else if (isSwagger(data as string, language)) {
		return 'swagger';
	} else if (isBaseAsset(data as string, language)) {
		return getBaseAsset(data as string, language);
	} else {
		return '';
	}
}

export function getLanguage(data: object | string) {
	let language = '';
	if (isJSON(data)) {
		language = 'json';
	} else if (isYAML(data)) {
		language = 'yaml';
	}
	return language;
}


export function getContentType(language: string) {
	let contentType = '';
	if ((language === 'yaml') || (language === 'yml')) {
		contentType = AppConstants.APPLICATION_YAML_REQ_TYPE;
	} else if (language === 'json') {
		contentType = AppConstants.APPLICATION_JSON_REQ_TYPE;
	}
	return contentType;
}

export function isInvalidFile(text: string, fileExt: string) {
	if (fileExt === 'yaml' || fileExt === 'yml') {
		try {
			if (text.trim().startsWith('{') || text.trim().startsWith('[')) {
				return true;
			}
			if (text.trim() !== '') {
				yaml.loadAll(text);
			}
			return false;
		} catch (error) {
			return true
		}
	}

	if (fileExt === 'json') {
		try {
			if (text.trim() !== '') {
				JSON.parse(text) as BaseAsset;
			}
			return false;
		} catch (error) {
			return true;
		}
	}

	return true;
};
