import { List } from 'immutable';
import React, { Component } from 'react';
import PropTypes from 'prop-types';
import { Button, Picker, ScrollView, Text, TextInput, View } from 'react-native';
import { Avatar } from 'react-native-elements';

import { getEmailAvailability, getNomAvailability } from '../../api/profile.js';

import EditNomDeBid from './ProfileInputs/EditNomDeBid.js';
import PasswordInput from './ProfileInputs/PasswordInput.js';
import PhoneListInput from './ProfileInputs/PhoneListInput.js';

import styles from './Profile.styles.js';

const STRINGS = {
    BUTTONS: {
        CANCEL: 'Cancel',
        SUBMIT: 'Save changes',
    },
    DEV: {
        FORM_INCOMPLETE_SUBMIT: 'Incomplete form... how did the button become enabled?',
    },
    ERRORS: {
        FORM_SUBMIT_ERRORS: 'Please complete all of the required fields. They have bold labels.',
    },
    HEADINGS: {
        NOM: 'Nom de Bid',
        PASSWORD: 'Password',
    },
};

export default class EditProfile extends Component {
    static get propTypes() {
        return {
            addresses: PropTypes.oneOfType([PropTypes.array, PropTypes.instanceOf(List)]),
            avatar: PropTypes.string,
            cancelEditAction: PropTypes.func.isRequired,
            email: PropTypes.string,
            firstName: PropTypes.string,
            hasLocalAccount: PropTypes.bool,
            initials: PropTypes.string,
            isGeneratedNomDeBid: PropTypes.bool,
            lastName: PropTypes.string,
            nomDeBid: PropTypes.string,
            phones: PropTypes.oneOfType([PropTypes.array, PropTypes.instanceOf(List)]),
            saveProfileAction: PropTypes.func.isRequired,
            showPasswordEntry: PropTypes.bool,
        };
    }

    static get defaultProps() {
        return {
            addresses: new List(),
            avatar: null,
            email: null,
            firstName: null,
            hasLocalAccount: false,
            initials: null,
            isGeneratedNomDeBid: false,
            lastName: null,
            nomDeBid: null,
            phones: new List(),
            showPasswordEntry: false,
        };
    }

    constructor(props) {
        super(props);

        this.state = {
            addresses: this.props.addresses,
            avatar: this.props.avatar,
            email: this.props.email,
            firstName: this.props.firstName,
            lastName: this.props.lastName,
            invalidEmail: null,
            nomDeBid: this.props.nomDeBid,
            password: this.props.password,
            passwordMatch: false,
            phones: this.props.phones,
        };

        this.handleCancel = this.handleCancel.bind(this);
        this.handleSubmit = this.handleSubmit.bind(this);
    }

    _handleValidPasswordEntry(password) {
        if (!password) {
            this.setState({ passwordMatch: false });
            return;
        }

        this.setState({ password, passwordMatch: true });
    }

    _validateEmail() {
        getEmailAvailability(this.state.email)
            .then((result) => {
                console.log(`_validateEmail => getEmailAvailability(${this.state.email}):`, result);
                this.setState({ invalidEmail: !result.available });
            });
    }


    getProfileFromState() {
        return {
            addresses: this.state.addresses.toArray(),
            avatar: this.state.avatar,
            email: this.state.email,
            firstName: this.state.firstName,
            lastName: this.state.lastName,
            nomDeBid: this.state.nomDeBid,
            password: this.state.password,
            phones: this.state.phones.toArray(),
        };
    }

    handleCancel() {
        this.props.cancelEditAction();
    }

    handleSubmit() {
        if (!this.isFormComplete()) {
            console.error(STRINGS.DEV.FORM_INCOMPLETE_SUBMIT);
            alert(STRINGS.ERRORS.FORM_SUBMIT_ERRORS);
            return;
        }

        this.props.saveProfileAction(this.getProfileFromState());
    }

    isFormComplete() {
        const { showPasswordEntry } = this.props;
        const { password, passwordCheck } = this.state;

        return (
            !this.state.invalidEmail &&
            !this.state.invalidNomDeBid &&
            !!this.state.firstName &&
            !!this.state.lastName &&
            !!this.state.email &&
            !!this.state.nomDeBid &&
            !!this.state.phones.size &&
            ((showPasswordEntry && EditProfile.validatePasswordMatch(password, passwordCheck)) || !showPasswordEntry)
        );
    }

    render() {
        const { hasLocalAccount, isGeneratedNomDeBid, showPasswordEntry } = this.props;
        const { addresses, avatar, firstName, invalidEmail, lastName, password, passwordCheck, phones } = this.state;

        return (
            <ScrollView style={styles.profileFormWrap}>
                <View style={[styles.sectionWrap, styles.avatarWrap]}>
                    {avatar !== null ? (
                        <Avatar source={{ uri: this.state.avatar }} showEditButton />
                    ) : (
                        <Avatar title={this.props.initials} showEditButton />
                    )}
                </View>
                <View style={[styles.sectionWrap, styles.emailWrap, styles.requiredWrap]}>
                    <TextInput
                        autoCapitalize="none"
                        keyboardType="email-address"
                        onChangeText={(text) => this.setState({ email: text })}
                        onEndEditing={(text) => this._validateEmail(text)}
                        placeholder="email address"
                        style={[styles.textInput, styles.requiredInput]}
                        value={this.state.email || ''}
                    />
                    {invalidEmail === true && (
                        <View style={styles.emailTaken}>
                            <Text style={{color:'red'}}>{`You've already registered!`}</Text>
                            <Button title="Forgot Password" onPress={() => {}} />
                        </View>
                    )}
                    {invalidEmail === false && (
                        <Text style={{color:'green'}}>{`Great, lets add a bit more detail...`}</Text>
                    )}
                </View>
                <View style={[styles.sectionWrap, styles.nameWrap]}>
                    <TextInput
                        onChange={(text) => this.setState({ firstName: text })}
                        placeholder="first name"
                        style={[styles.textInput, styles.requiredInput]}
                        value={this.state.firstName || ''}
                    />
                    <TextInput
                        onChange={(text) => this.setState({ lastName: text })}
                        placeholder="last name"
                        style={[styles.textInput, styles.requiredInput]}
                        value={this.state.lastName || ''}
                    />
                </View>
                {showPasswordEntry && (
                    <View style={[styles.sectionWrap, styles.password, styles.requiredWrap]}>
                        <Text style={styles.groupHeading}>{STRINGS.HEADINGS.PASSWORD}</Text>
                        <PasswordInput handleValidPasswordEntry={this._handleValidPasswordEntry} />
                    </View>
                )}
                {(isGeneratedNomDeBid || !hasLocalAccount) && (
                    <View style={[styles.sectionWrap, styles.nomWrap, styles.requiredWrap]}>
                        <Text style={styles.groupHeading}>{STRINGS.HEADINGS.NOM}</Text>
                        <EditNomDeBid
                            isGeneratedNomDeBid={isGeneratedNomDeBid}
                            isStandalone
                            nomDeBid={this.state.nomDeBid}
                            updateNomDeBid={(nomDeBid) => this.setState({ nomDeBid })}
                        />
                    </View>
                )}
                <View style={[styles.sectionWrap, styles.phonesWrap]}>
                    <PhoneListInput
                        handleAdd={(phones) => this.setState({ phones })}
                        handleDelete={(phones) => this.setState({ phones })}
                        handleEdit={(phones) => this.setState({ phones })}
                        phones={phones}
                    />
                </View>
                <View style={[styles.sectionWrap, styles.addressesWrap]}>
                    {addresses !== null && addresses.size > 0 && (
                        /* LIST ADDRESSES */
                        <View />
                    )}
                    <Button title="Add address" onPress={() => false} />
                </View>
                <View style={styles.register}>
                    <Button title={STRINGS.BUTTONS.SUBMIT} onPress={this.handleSubmit} />
                    <Button title={STRINGS.BUTTONS.CANCEL} onPress={this.handleCancel} />
                </View>
            </ScrollView>
        );
    }
}
