import styles from './SignupForm.module.scss';

import { useState, FormEvent } from 'react';
import axios from 'axios';

enum Status {
    NotSent = 1,
    Sending,
    Sent,
    ServerError,
    InvalidEmail,
}

export default function SignupForm() {
    let [ status, setStatus ] = useState(Status.NotSent);
    let [ email, setEmail ] = useState('');

    function submit(e: FormEvent<HTMLFormElement>) {
        e.preventDefault();
        if (email === '') {
            setStatus(Status.InvalidEmail);
            return;
        }

        setStatus(Status.Sending);

        axios.post('/api/send', { email }).then((response) => {
            if (response.status === 200) {
                setStatus(Status.Sent);
            } else if (response.status === 400) setStatus(Status.InvalidEmail);
            else setStatus(Status.ServerError);
        }).catch(() => setStatus(Status.ServerError));
    }

    if (status === Status.Sending || status === Status.Sent) {
        if (status === Status.Sending) return <div className={styles.form}><h4>Loading</h4></div>;
        else return (
            <div className={styles.form}>
                <h4>Thanks! We'll keep you up to date.</h4>
            </div>
        );
    } else return (
        <div className={styles.form}>
            <form className={styles.signup} onSubmit={submit}>
                <input
                    type="email"
                    placeholder="Please enter your email."
                    value={email}
                    onChange={e => setEmail(e.currentTarget.value)}
                />
                <button>Join waiting list.</button>
            </form>
            { status === Status.ServerError && <h4>An error has occured, please try again later.</h4> }
            { status === Status.InvalidEmail && <h4>Please provide a valid email</h4> }
        </div>
    );
}