/*
	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 <http://www.gnu.org/licenses/>.
*/

"use strict";

const Promise = require("bluebird");
const React = require("react");
const Redux = require("react-redux");

const api = require("../lib/api");
const user = require("../redux/reducers/user").actions;
const submit = require("../lib/submit");

const Languages = require("../components/languages");
const Submit = require("../components/submit");

const {
	Checkbox,
	Select,
} = require("../components/form-fields").formFields(user.setSettingsVal, (state) => state.user.settings);

module.exports = function UserSettings() {
	const dispatch = Redux.useDispatch();

	const [errorMsg, setError] = React.useState("");
	const [statusMsg, setStatus] = React.useState("");

	const updateSettings = submit(
		() => dispatch(api.user.updateSettings()),
		{setStatus, setError}
	);

	return (
		<>
			<div className="user-settings">
				<h1>Post settings</h1>
				<Select id="source.language" name="Default post language" options={
					<Languages/>
				}>
				</Select>
				<Select id="source.privacy" name="Default post privacy" options={
					<>
						<option value="private">Private / followers-only</option>
						<option value="unlisted">Unlisted</option>
						<option value="public">Public</option>
					</>
				}>
					<a href="https://docs.gotosocial.org/en/latest/user_guide/posts/#privacy-settings" target="_blank" className="moreinfolink" rel="noreferrer">Learn more about post privacy settings (opens in a new tab)</a>
				</Select>
				<Select id="source.status_format" name="Default post format" options={
					<>
						<option value="plain">Plain (default)</option>
						<option value="markdown">Markdown</option>
					</>
				}>
					<a href="https://docs.gotosocial.org/en/latest/user_guide/posts/#input-types" target="_blank" className="moreinfolink" rel="noreferrer">Learn more about post format settings (opens in a new tab)</a>
				</Select>
				<Checkbox
					id="source.sensitive"
					name="Mark my posts as sensitive by default"
				/>

				<Submit onClick={updateSettings} label="Save post settings" errorMsg={errorMsg} statusMsg={statusMsg}/>
			</div>
			<div>
				<PasswordChange/>
			</div>
		</>
	);
};

function PasswordChange() {
	const dispatch = Redux.useDispatch();

	const [errorMsg, setError] = React.useState("");
	const [statusMsg, setStatus] = React.useState("");

	const [oldPassword, setOldPassword] = React.useState("");
	const [newPassword, setNewPassword] = React.useState("");
	const [newPasswordConfirm, setNewPasswordConfirm] = React.useState("");

	function changePassword() {
		if (newPassword !== newPasswordConfirm) {
			setError("New password and confirm new password did not match!");
			return;
		}
		
		setStatus("PATCHing");
		setError("");
		return Promise.try(() => {
			let data = {
				old_password: oldPassword,
				new_password: newPassword
			};
			return dispatch(api.apiCall("POST", "/api/v1/user/password_change", data, "form"));
		}).then(() => {
			setStatus("Saved!");
			setOldPassword("");
			setNewPassword("");
			setNewPasswordConfirm("");
		}).catch((e) => {
			setError(e.message);
			setStatus("");
		});
	}

	return (
		<>
			<h1>Change password</h1>
			<div className="labelinput">
				<label htmlFor="password">Current password</label>
				<input name="password" id="password" type="password" autoComplete="current-password" value={oldPassword} onChange={(e) => setOldPassword(e.target.value)} />
			</div>
			<div className="labelinput">
				<label htmlFor="new-password">New password</label>
				<input name="new-password" id="new-password" type="password" autoComplete="new-password" value={newPassword} onChange={(e) => setNewPassword(e.target.value)} />
			</div>
			<div className="labelinput">
				<label htmlFor="confirm-new-password">Confirm new password</label>
				<input name="confirm-new-password" id="confirm-new-password" type="password" autoComplete="new-password" value={newPasswordConfirm} onChange={(e) => setNewPasswordConfirm(e.target.value)} />
			</div>
			<Submit onClick={changePassword} label="Save new password" errorMsg={errorMsg} statusMsg={statusMsg}/>
		</>
	);
}