/*
   GoToSocial
   Copyright (C) 2021-2022 GoToSocial Authors admin@gotosocial.org
   This program is free software: you can redistribute it and/or modify
   it under the terms of the GNU Affero General Public License as published by
   the Free Software Foundation, either version 3 of the License, or
   (at your option) any later version.
   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU Affero General Public License for more details.
   You should have received a copy of the GNU Affero General Public License
   along with this program.  If not, see .
*/
"use strict";
const Promise = require("bluebird");
const React = require("react");
const ReactDom = require("react-dom");
const oauthLib = require("./oauth");
module.exports = function createPanel(clientName, scope, Component) {
	ReactDom.render(, document.getElementById("root"));
	function Panel() {
		const [oauth, setOauth] = React.useState();
		const [hasAuth, setAuth] = React.useState(false);
		const [oauthState, setOauthState] = React.useState(localStorage.getItem("oauth"));
		React.useEffect(() => {
			let state = localStorage.getItem("oauth");
			if (state != undefined) {
				state = JSON.parse(state);
				let restoredOauth = oauthLib(state.config, state);
				Promise.try(() => {
					return restoredOauth.callback();
				}).then(() => {
					setAuth(true);
				});
				setOauth(restoredOauth);
			}
		}, [setAuth, setOauth]);
		if (!hasAuth && oauth && oauth.isAuthorized()) {
			setAuth(true);
		}
		if (oauth && oauth.isAuthorized()) {
			return ;
		} else if (oauthState != undefined) {
			return "processing oauth...";
		} else {
			return ;
		}
	}
	function Auth({setOauth}) {
		const [ instance, setInstance ] = React.useState("");
		React.useEffect(() => {
			let isStillMounted = true;
			// check if current domain runs an instance
			let thisUrl = new URL(window.location.origin);
			thisUrl.pathname = "/api/v1/instance";
			Promise.try(() => {
				return fetch(thisUrl.href);
			}).then((res) => {
				if (res.status == 200) {
					return res.json();
				}
			}).then((json) => {
				if (json && json.uri && isStillMounted) {
					setInstance(json.uri);
				}
			}).catch((e) => {
				console.log("error checking instance response:", e);
			});
			return () => {
				// cleanup function
				isStillMounted = false;
			};
		}, []);
		function doAuth() {
			return Promise.try(() => {
				return new URL(instance);
			}).catch(TypeError, () => {
				return new URL(`https://${instance}`);
			}).then((parsedURL) => {
				let url = parsedURL.toString();
				let oauth = oauthLib({
					instance: url,
					client_name: clientName,
					scope: scope,
					website: window.location.href
				});
				setOauth(oauth);
				setInstance(url);
				return oauth.register().then(() => {
					return oauth;
				});
			}).then((oauth) => {
				return oauth.authorize();
			}).catch((e) => {
				console.log("error authenticating:", e);
			});
		}
		function updateInstance(e) {
			if (e.key == "Enter") {
				doAuth();
			} else {
				setInstance(e.target.value);
			}
		}
		return (
			
		);
	}
};