import React, {useState, useRef} from 'react';
import {RouteProp} from '@react-navigation/native';
import {StackNavigationProp} from '@react-navigation/stack';
import {
  View,
  Text,
  StyleSheet,
  StatusBar,
  Alert,
  Platform,
  TouchableOpacity,
  KeyboardAvoidingView,
} from 'react-native';

import {OnboardingStackParams} from '../../routes';

import {
  ArrowButton,
  RegistrationWizard,
  TaggInput,
  Background,
  LoadingIndicator,
} from '../../components';

import {trackPromise} from 'react-promise-tracker';

import {SEND_OTP_ENDPOINT} from '../../constants';

import {phoneRegex} from '../../constants';
import {BackgroundGradientType, VerificationScreenType} from '../../types';

type RegistrationScreenOneRouteProp = RouteProp<
  OnboardingStackParams,
  'RegistrationOne'
>;
type RegistrationScreenOneNavigationProp = StackNavigationProp<
  OnboardingStackParams,
  'RegistrationOne'
>;
interface RegistrationOneProps {
  route: RegistrationScreenOneRouteProp;
  navigation: RegistrationScreenOneNavigationProp;
}
/**
 * Registration screen 1 for Email
 * @param navigation react-navigation navigation object
 */
const RegistrationOne: React.FC<RegistrationOneProps> = ({navigation}) => {
  // // refs for changing focus
  const phoneRef = useRef();

  // registration form state
  const [form, setForm] = useState({
    phone_number: '',
    isValidPhone: false,
    attemptedSubmit: false,
  });

  /*
   * Handles changes to the email field value and verifies the input by updating state and running a validation function.
   */
  const handlePhoneUpdate = (phone_number: string) => {
    phone_number = phone_number.trim();
    let isValidPhone: boolean = phoneRegex.test(phone_number);
    setForm({
      ...form,
      phone_number,
      isValidPhone,
    });
  };

  /**
   * Handles a click on the "next" arrow button by navigating to Verification if email is filled correctly
   */
  const goToVerification = async () => {
    if (!form.attemptedSubmit) {
      setForm({
        ...form,
        attemptedSubmit: true,
      });
    }
    try {
      if (form.isValidPhone) {
        let sendOtpResponse = await trackPromise(
          fetch(SEND_OTP_ENDPOINT, {
            method: 'POST',
            body: JSON.stringify({
              phone_number: '+1' + form.phone_number,
            }),
          }),
        );
        let otpStatusCode = sendOtpResponse.status;
        if (otpStatusCode === 200) {
          navigation.navigate('Verification', {
            id: form.phone_number,
            screenType: VerificationScreenType.Phone,
          });
        } else if (otpStatusCode === 409) {
          Alert.alert(
            'This phone number is already registered with us, please use another email.',
          );
        } else {
          Alert.alert(
            "Looks like Our phone servers might be down  😓'",
            "Try again in a couple minutes. We're sorry for the inconvenience.",
          );
        }
      } else {
        setForm({...form, attemptedSubmit: false});
        setTimeout(() => setForm({...form, attemptedSubmit: true}));
      }
    } catch (error) {
      Alert.alert(
        'Looks like our servers are down. 😓',
        "Try again in a couple minutes. We're sorry for the inconvenience.",
      );
      return {
        name: 'Send OTP error',
        description: error,
      };
    }
  };

  const Footer = () => (
    <View style={styles.footer}>
      <ArrowButton
        direction="backward"
        onPress={() => navigation.navigate('Login')}
      />
      <TouchableOpacity onPress={goToVerification}>
        <ArrowButton
          direction="forward"
          disabled={!form.isValidPhone}
          onPress={goToVerification}
        />
      </TouchableOpacity>
    </View>
  );

  return (
    <Background
      style={styles.container}
      gradientType={BackgroundGradientType.Light}>
      <StatusBar barStyle="light-content" />
      <RegistrationWizard style={styles.wizard} step="two" />
      <KeyboardAvoidingView
        behavior={Platform.OS === 'ios' ? 'padding' : 'height'}
        style={styles.container}>
        <View>
          <Text style={styles.formHeader}>ENTER PHONE NUMBER</Text>
        </View>
        <TaggInput
          maxLength={12} // currently only support US phone numbers
          accessibilityHint="Enter your phone number."
          accessibilityLabel="Phone number input field."
          placeholder="Phone Number"
          autoCompleteType="tel"
          textContentType="telephoneNumber"
          autoCapitalize="none"
          returnKeyType="next"
          keyboardType="phone-pad"
          onChangeText={handlePhoneUpdate}
          blurOnSubmit={false}
          ref={phoneRef}
          valid={form.isValidPhone}
          invalidWarning={'Please enter a valid 10 digit number.'}
          attemptedSubmit={form.attemptedSubmit}
          width={280}
          onSubmitEditing={goToVerification}
        />
        <LoadingIndicator />
      </KeyboardAvoidingView>
      <Footer />
    </Background>
  );
};

const styles = StyleSheet.create({
  container: {
    flex: 1,
    alignItems: 'center',
    justifyContent: 'center',
  },
  wizard: {
    ...Platform.select({
      ios: {
        top: 50,
      },
      android: {
        bottom: 40,
      },
    }),
  },
  formHeader: {
    color: '#fff',
    fontSize: 30,
    fontWeight: '600',
    marginBottom: '16%',
  },
  load: {
    top: '5%',
  },
  footer: {
    width: '100%',
    flexDirection: 'row',
    justifyContent: 'space-around',
    ...Platform.select({
      ios: {
        bottom: '20%',
      },
      android: {
        bottom: '10%',
      },
    }),
  },
});

export default RegistrationOne;
