'use strict';

import React from 'react';
import { History } from 'react-router';

import Form from './ascribe_forms/form';
import Property from './ascribe_forms/property';
import ApiUrls from '../constants/api_urls';
import AscribeSpinner from './ascribe_spinner';

import GlobalNotificationModel from '../models/global_notification_model';
import GlobalNotificationActions from '../actions/global_notification_actions';
import { getLangText } from '../utils/lang_utils';
import { setDocumentTitle } from '../utils/dom_utils';


let PasswordResetContainer = React.createClass({
    propTypes: {
        location: React.PropTypes.object
    },

    getInitialState() {
        return {isRequested: false};
    },

    handleRequestSuccess(email) {
        this.setState({isRequested: email});
    },

    render() {
        let { location } = this.props;

        if (location.query.email && location.query.token) {
            return (
                <div>
                    <PasswordResetForm
                        email={location.query.email}
                        token={location.query.token}/>
                </div>
            );
        }
        else {
            if (this.state.isRequested === false) {
                return (
                    <div>
                        <PasswordRequestResetForm
                            handleRequestSuccess={this.handleRequestSuccess}/>
                    </div>
                );
            }
            else if (this.state.isRequested) {
                return (
                    <div>
                        <div className="ascribe-login-text ascribe-login-header">
                            {getLangText('If your email address exists in our database, you will receive a password recovery link in a few minutes.')}
                        </div>
                    </div>
                );
            }
            else {
                return <span />;
            }
        }
  }
});

let PasswordRequestResetForm = React.createClass({
    propTypes: {
        handleRequestSuccess: React.PropTypes.func
    },

    handleSuccess() {
        let notificationText = getLangText('If your email address exists in our database, you will receive a password recovery link in a few minutes.');
        let notification = new GlobalNotificationModel(notificationText, 'success', 50000);
        GlobalNotificationActions.appendGlobalNotification(notification);
        this.props.handleRequestSuccess(this.refs.form.refs.email.state.value);
    },

    render() {
        setDocumentTitle(getLangText('Reset your password'));

        return (
            <Form
                ref="form"
                className='ascribe-form-wrapper'
                url={ApiUrls.users_password_reset_request}
                handleSuccess={this.handleSuccess}
                buttons={
                    <button
                        type="submit"
                        className="btn btn-default btn-wide">
                        {getLangText('Reset your password')}
                    </button>}
                spinner={
                    <span className="btn btn-default btn-wide btn-spinner">
                        <AscribeSpinner color="dark-blue" size="md" />
                    </span>
                    }>
                <div className="ascribe-form-header">
                    <h3>{getLangText('Reset your password')}</h3>
                </div>
                <Property
                    name='email'
                    label={getLangText('Email')}>
                    <input
                        type="email"
                        placeholder={getLangText('Enter your email and we\'ll send a link')}
                        name="email"
                        required/>
                </Property>
                <hr />
            </Form>
        );
    }
});

let PasswordResetForm = React.createClass({
    propTypes: {
        email: React.PropTypes.string,
        token: React.PropTypes.string
    },

    mixins: [History],

    getFormData() {
        return {
            email: this.props.email,
            token: this.props.token
        };
    },

    handleSuccess() {
        this.history.pushState(null, '/collection');
        let notification = new GlobalNotificationModel(getLangText('password successfully updated'), 'success', 10000);
        GlobalNotificationActions.appendGlobalNotification(notification);
    },

    render() {
        return (
            <Form
                ref="form"
                className='ascribe-form-wrapper'
                url={ApiUrls.users_password_reset}
                handleSuccess={this.handleSuccess}
                getFormData={this.getFormData}
                buttons={
                    <button
                        type="submit"
                        className="btn btn-default btn-wide">
                        {getLangText('Reset your password')}
                    </button>}
                spinner={
                    <span className="btn btn-default btn-wide btn-spinner">
                        <AscribeSpinner color="dark-blue" size="md" />
                    </span>
                    }>
                <div className="ascribe-form-header">
                    <h3>{getLangText('Reset the password for')} {this.props.email}</h3>
                </div>
                <Property
                    name='password'
                    label={getLangText('Password')}>
                    <input
                        type="password"
                        placeholder={getLangText('Enter a new password')}
                        name="password"
                        required/>
                </Property>
                <Property
                    name='password_confirm'
                    label={getLangText('Confirm password')}>
                    <input
                        type="password"
                        placeholder={getLangText('Enter your password once again')}
                        name="password"
                        required/>
                </Property>
                <hr />
            </Form>
        );
    }
});

export default PasswordResetContainer;