import React from 'react';
import { connect } from 'react-redux';
import PropTypes from 'prop-types';
import { Field, reduxForm, formValueSelector } from 'redux-form';
import { Trans } from 'react-i18next';

import Controls from './Controls';
import renderField from './renderField';
import { R_IPV4 } from '../../helpers/constants';

const required = (value) => {
    if (value || value === 0) {
        return false;
    }
    return <Trans>form_error_required</Trans>;
};

const ipv4 = (value) => {
    if (value && !new RegExp(R_IPV4).test(value)) {
        return <Trans>form_error_ip_format</Trans>;
    }
    return false;
};

const port = (value) => {
    if (value < 1 || value > 65535) {
        return <Trans>form_error_port</Trans>;
    }
    return false;
};

const toNumber = value => value && parseInt(value, 10);

let Settings = (props) => {
    const {
        handleSubmit,
        interfaceIp,
        dnsIp,
        invalid,
    } = props;

    return (
        <form className="setup__step" onSubmit={handleSubmit}>
            <div className="setup__group">
                <div className="setup__subtitle">
                    <Trans>install_settings_title</Trans>
                </div>
                <div className="row">
                    <div className="col-8">
                        <div className="form-group">
                            <label>
                                <Trans>install_settings_listen</Trans>
                            </label>
                            <Field
                                name="web.ip"
                                component={renderField}
                                type="text"
                                className="form-control"
                                placeholder="0.0.0.0"
                                validate={[ipv4, required]}
                            />
                        </div>
                    </div>
                    <div className="col-4">
                        <div className="form-group">
                            <label>
                                <Trans>install_settings_port</Trans>
                            </label>
                            <Field
                                name="web.port"
                                component={renderField}
                                type="number"
                                className="form-control"
                                placeholder="80"
                                validate={[port, required]}
                                normalize={toNumber}
                            />
                        </div>
                    </div>
                </div>
                <div className="setup__desc">
                    <Trans>install_settings_interface_link</Trans> <a href={`http://${interfaceIp}`}>{`http://${interfaceIp}`}</a>
                </div>
            </div>
            <div className="setup__group">
                <div className="setup__subtitle">
                    <Trans>install_settings_dns</Trans>
                </div>
                <div className="row">
                    <div className="col-8">
                        <div className="form-group">
                            <label>
                                <Trans>install_settings_listen</Trans>
                            </label>
                            <Field
                                name="dns.ip"
                                component={renderField}
                                type="text"
                                className="form-control"
                                placeholder="0.0.0.0"
                                validate={[ipv4, required]}
                            />
                        </div>
                    </div>
                    <div className="col-4">
                        <div className="form-group">
                            <label>
                                <Trans>install_settings_port</Trans>
                            </label>
                            <Field
                                name="dns.port"
                                component={renderField}
                                type="number"
                                className="form-control"
                                placeholder="80"
                                validate={[port, required]}
                                normalize={toNumber}
                            />
                        </div>
                    </div>
                </div>
                <p className="setup__desc">
                    <Trans>install_settings_dns_desc</Trans> <strong>{dnsIp}</strong>
                </p>
            </div>
            <Controls invalid={invalid} />
        </form>
    );
};

Settings.propTypes = {
    handleSubmit: PropTypes.func.isRequired,
    interfaceIp: PropTypes.string.isRequired,
    dnsIp: PropTypes.string.isRequired,
    invalid: PropTypes.bool.isRequired,
    initialValues: PropTypes.object,
};

Settings.defaultProps = {
    interfaceIp: '192.168.0.1',
    dnsIp: '192.168.0.1',
};

const selector = formValueSelector('install');

Settings = connect((state) => {
    const interfaceIp = selector(state, 'web.ip');
    const dnsIp = selector(state, 'dns.ip');

    return {
        interfaceIp,
        dnsIp,
    };
})(Settings);

export default reduxForm({
    form: 'install',
    destroyOnUnmount: false,
    forceUnregisterOnUnmount: true,
})(Settings);