
import config from '../config/dev';

export function CatchReportAsyncException(
	target: object,
	propertyName: string,
	propertyDescriptor: PropertyDescriptor,
): PropertyDescriptor {

	const originalMethod = propertyDescriptor.value;
	propertyDescriptor.value = async function(...args: any[]): Promise<any> {
		try {
			// @ts-ignore
			return await originalMethod.apply(this, args);
		} catch (error) {
			if (rollbar) {
				rollbar.error(error, args);
			}
			throw error;
		}
	};

	return propertyDescriptor;
}

export function CatchReportException(
	target: object,
	propertyName: string,
	propertyDescriptor: PropertyDescriptor,
): PropertyDescriptor {

	const originalMethod = propertyDescriptor.value;
	propertyDescriptor.value = function(...args: any[]): any {
		try {
			// @ts-ignore
			return originalMethod.apply(this, args);
		} catch (error) {
			if (rollbar) {
				rollbar.error(error, args);
			}
			throw error;
		}
	};

	return propertyDescriptor;
}

const rollbarConfig  = {
	accessToken: '6c4041c05630454d89eef023ecc5e834',
	captureUncaught: false,
	captureUnhandledRejections: false,
	payload: {
		environment: config.environment
	}
};

const rollbar: any = (global && global['rollbar']) ? new global['rollbar'](rollbarConfig) : null;
