/*
	Javascript wrapper for the Bludit API
*/

class API {

	constructor(apiURL, apiToken, apiAuth) {
		this.apiURL = apiURL;
		this.body = {
			token: apiToken,
			authentication: apiAuth
		}
	}

	async getPage(args) {
		var url = this.apiURL + "pages/" + args['pageKey'];
		var parameters = "?token=" + this.body.token + "&authentication=" + this.body.authentication;
		try {
			const response = await fetch(url + parameters, {
				method: "GET"
			});
			var json = await response.json();
			return json;
		} catch (err) {
			console.log(response);
			console.log(err);
			return {'message': 'Error from API. Open the inspector from the browser for more details.'};
		}
	}

	async createPage(args={}) {
		var url = this.apiURL + "pages";
		var body = Object.assign({}, this.body, args);
		try {
			var response = await fetch(url, {
				credentials: "same-origin",
				method: "POST",
				body: JSON.stringify(body),
				headers: new Headers({
					"Content-Type": "application/json"
				})
			});
			var json = await response.json();
			return json;
		} catch (err) {
			console.log(response);
			console.log(err);
			return {'message': 'Error from API. Open the inspector from the browser for more details.'};
		}
	}

	/*	Save page fields

		@args['pageKey']		string		Page key from the page to edit
		@args					array		Arguments can be any of the fields from a page
		@return				string		New page key
	*/
	async savePage(args) {
		var url = this.apiURL + "pages/" + args['pageKey'];
		var body = Object.assign({}, this.body, args);
		try {
			var response = await fetch(url, {
				credentials: "same-origin",
				method: "PUT",
				body: JSON.stringify(body),
				headers: new Headers({
					"Content-Type": "application/json"
				})
			});
			var json = await response.json();
			return json;
		} catch (err) {
			console.log(response);
			console.log(err);
			return {'message': 'Error from API. Open the inspector from the browser for more details.'};
		}
	}

	/*	Generates unique slug text for the a page

		@args['pageKey']		string		Page key for the page to generate the slug url
		@args['text']			string		Text that you want to generate the slug url
		@args['parentKey']		string		Parent page key if the page has one, if not empty string
		@return				string		Slug text
	*/
	async friendlyURL(args) {
		var url = this.apiURL + "helper/friendly-url/";
		var parameters = "?token=" + this.body.token + "&authentication=" + this.body.authentication;
		parameters = parameters + "&pageKey=" + args['pageKey'];
		parameters = parameters + "&text=" + args['text'];
		parameters = parameters + "&parentKey=" + args['parentKey'];
		try {
			const response = await fetch(url + parameters, {
				method: "GET"
			});
			var json = await response.json();
			return json;
		} catch (err) {
			console.log(response);
			console.log(err);
			return {'message': 'Error from API. Open the inspector from the browser for more details.'};
		}
	}

	/*	Get all files uploaded for the page

		@args				string
		@return				array
	*/
	async getPageFiles(args) {
		var url = this.apiURL + "pages/files/" + args['pageKey'];
		var parameters = "?token=" + this.body.token + "&authentication=" + this.body.authentication;
		try {
			const response = await fetch(url + parameters, {
				method: "GET"
			});
			var json = await response.json();
			return json;
		} catch (err) {
			console.log(response);
			console.log(err);
			return {'message': 'Error from API. Open the inspector from the browser for more details.'};
		}
	}

	/*	Save settings

		@args				array		Arguments can be any of the fields from settings
		@return				array
	*/
	async saveSettings(args) {
		var url = this.apiURL + "settings";
		var body = Object.assign({}, this.body, args);
		try {
			var response = await fetch(url, {
				credentials: "same-origin",
				method: "PUT",
				body: JSON.stringify(body),
				headers: new Headers({
					"Content-Type": "application/json"
				})
			});
			var json = await response.json();
			return json;
		} catch (err) {
			console.log(response);
			console.log(err);
			return {'message': 'Error from API. Open the inspector from the browser for more details.'};
		}
	}

	/*	Create a new category

		@args				array		Arguments can be any of the fields from a category
		@return				string		New category key
	*/
	async createCategory(args) {
		var url = this.apiURL + "categories";
		var body = Object.assign({}, this.body, args);
		try {
			var response = await fetch(url, {
				credentials: "same-origin",
				method: "POST",
				body: JSON.stringify(body),
				headers: new Headers({
					"Content-Type": "application/json"
				})
			});
			var json = await response.json();
			return json;
		} catch (err) {
			console.log(response);
			console.log(err);
			return {'message': 'Error from API. Open the inspector from the browser for more details.'};
		}
	}

	/*	Edit a category

		@args				array		Arguments can be any of the fields from a category
		@return				string		The category key
	*/
	async editCategory(args) {
		var url = this.apiURL + "categories/" + args['key'];
		var body = Object.assign({}, this.body, args);
		try {
			var response = await fetch(url, {
				credentials: "same-origin",
				method: "PUT",
				body: JSON.stringify(body),
				headers: new Headers({
					"Content-Type": "application/json"
				})
			});
			var json = await response.json();
			return json;
		} catch (err) {
			console.log(response);
			console.log(err);
			return {'message': 'Error from API. Open the inspector from the browser for more details.'};
		}
	}

	/*	Delete a category

		@args				array		Array => (key: string)
		@return				string		The category key deleted
	*/
	async deleteCategory(args) {
		var url = this.apiURL + "categories/" + args['key'];
		var body = this.body;
		try {
			var response = await fetch(url, {
				credentials: "same-origin",
				method: "DELETE",
				body: JSON.stringify(body),
				headers: new Headers({
					"Content-Type": "application/json"
				})
			});
			var json = await response.json();
			return json;
		} catch (err) {
			console.log(response);
			console.log(err);
			return {'message': 'Error from API. Open the inspector from the browser for more details.'};
		}
	}

	/*	Delete a page

		@args				array		Array => (key: string)
		@return				string		The page key deleted
	*/
	async deletePage(args) {
		var url = this.apiURL + "pages/" + args['key'];
		var body = this.body;
		try {
			var response = await fetch(url, {
				credentials: "same-origin",
				method: "DELETE",
				body: JSON.stringify(body),
				headers: new Headers({
					"Content-Type": "application/json"
				})
			});
			var json = await response.json();
			return json;
		} catch (err) {
			console.log(response);
			console.log(err);
			return {'message': 'Error from API. Open the inspector from the browser for more details.'};
		}
	}

	/*	Delete the profile picture from a user

		@args				array		Array => (username: string)
		@return				string		The username
	*/
	async deleteProfilePicture(args) {
		var url = this.apiURL + "users/picture/" + args['username'];
		var body = this.body;
		try {
			var response = await fetch(url, {
				credentials: "same-origin",
				method: "DELETE",
				body: JSON.stringify(body),
				headers: new Headers({
					"Content-Type": "application/json"
				})
			});
			var json = await response.json();
			return json;
		} catch (err) {
			console.log(response);
			console.log(err);
			return {'message': 'Error from API. Open the inspector from the browser for more details.'};
		}
	}

	/*	Delete the site logo
	*/
	async deleteSiteLogo() {
		var url = this.apiURL + "settings/logo"
		var body = this.body;
		try {
			var response = await fetch(url, {
				credentials: "same-origin",
				method: "DELETE",
				body: JSON.stringify(body),
				headers: new Headers({
					"Content-Type": "application/json"
				})
			});
			var json = await response.json();
			return json;
		} catch (err) {
			console.log(response);
			console.log(err);
			return {'message': 'Error from API. Open the inspector from the browser for more details.'};
		}
	}

	/*	Delete file from a page
	*/
	async deletePageFile(args) {
		var url = this.apiURL + "pages/files/" + args['key']
		var body = Object.assign({}, this.body, args);
		try {
			var response = await fetch(url, {
				credentials: "same-origin",
				method: "DELETE",
				body: JSON.stringify(body),
				headers: new Headers({
					"Content-Type": "application/json"
				})
			});
			var json = await response.json();
			return json;
		} catch (err) {
			console.log(response);
			console.log(err);
			return {'message': 'Error from API. Open the inspector from the browser for more details.'};
		}
	}

	/*	Create a new user

		@args				array		Arguments can be any of the fields from a user
		@return				string		Returns the username created
	*/
	async createUser(args) {
		var url = this.apiURL + "users";
		var body = Object.assign({}, this.body, args);
		try {
			var response = await fetch(url, {
				credentials: "same-origin",
				method: "POST",
				body: JSON.stringify(body),
				headers: new Headers({
					"Content-Type": "application/json"
				})
			});
			var json = await response.json();
			return json;
		} catch (err) {
			console.log(response);
			console.log(err);
			return {'message': 'Error from API. Open the inspector from the browser for more details.'};
		}
	}

	/*	Edit an user

		@args				array		Arguments can be any of the fields from an user
		@return				string		The username
	*/
	async editUser(args) {
		var url = this.apiURL + "users/" + args['username'];
		var body = Object.assign({}, this.body, args);
		try {
			var response = await fetch(url, {
				credentials: "same-origin",
				method: "PUT",
				body: JSON.stringify(body),
				headers: new Headers({
					"Content-Type": "application/json"
				})
			});
			var json = await response.json();
			return json;
		} catch (err) {
			console.log(response);
			console.log(err);
			return {'message': 'Error from API. Open the inspector from the browser for more details.'};
		}
	}

	/*	Delete user
    @args				array		Arguments can be any of the fields from an user
    @return				string		The username
	*/
	async deleteUser(args) {
		var url = this.apiURL + "users/" + args['username'];
		var body = Object.assign({}, this.body, args);
		try {
			var response = await fetch(url, {
				credentials: "same-origin",
				method: "DELETE",
				body: JSON.stringify(body),
				headers: new Headers({
					"Content-Type": "application/json"
				})
			});
			var json = await response.json();
			return json;
		} catch (err) {
			console.log(response);
			console.log(err);
			return {'message': 'Error from API. Open the inspector from the browser for more details.'};
		}
	}


	/*	Install and activate a plugin === Bludit v4

		@args				array
		@return				string
	*/
	async activatePlugin(args) {
		var url = this.apiURL + "plugins/" + args['className'];
		var body = Object.assign({}, this.body, args);
		try {
			var response = await fetch(url, {
				credentials: "same-origin",
				method: "POST",
				body: JSON.stringify(body),
				headers: new Headers({
					"Content-Type": "application/json"
				})
			});
			var json = await response.json();
			return json;
		} catch (err) {
			console.log(response);
			console.log(err);
			return {'message': 'Error from API. Open the inspector from the browser for more details.'};
		}
	}

	/*	Deactivate and uninstall a plugin === Bludit v4

		@args				array
		@return				string
	*/
	async deactivatePlugin(args) {
		var url = this.apiURL + "plugins/" + args['className'];
		var body = Object.assign({}, this.body, args);
		try {
			var response = await fetch(url, {
				credentials: "same-origin",
				method: "DELETE",
				body: JSON.stringify(body),
				headers: new Headers({
					"Content-Type": "application/json"
				})
			});
			var json = await response.json();
			return json;
		} catch (err) {
			console.log(response);
			console.log(err);
			return {'message': 'Error from API. Open the inspector from the browser for more details.'};
		}
	}

	/*	Configure a plugin

		@args				array		Arguments can be any of the fields from the plugin database
		@return				string		The plugin class name
	*/
	async configurePlugin(args) {
		var url = this.apiURL + "plugins/" + args['className'];
		var body = Object.assign({}, this.body, args);
		try {
			var response = await fetch(url, {
				credentials: "same-origin",
				method: "PUT",
				body: JSON.stringify(body),
				headers: new Headers({
					"Content-Type": "application/json"
				})
			});
			var json = await response.json();
			return json;
		} catch (err) {
			console.log(response);
			console.log(err);
			return {'message': 'Error from API. Open the inspector from the browser for more details.'};
		}
	}

}