import React from 'react';
import {OnboardingStackParams} from '../../routes';
import {StackNavigationProp} from '@react-navigation/stack';

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

import {
  TAGG_LIGHT_PURPLE,
  VERIFY_INVITATION_CODE_ENDPOUNT,
} from '../../constants';

import {Text} from 'react-native-animatable';
import {
  CodeField,
  Cursor,
  useBlurOnFulfill,
  useClearByFocusCell,
} from 'react-native-confirmation-code-field';
import {
  StyleSheet,
  View,
  KeyboardAvoidingView,
  Alert,
  Platform,
} from 'react-native';

import {BackgroundGradientType} from '../../types';
import {
  ERROR_DOUBLE_CHECK_CONNECTION,
  ERROR_INVALID_INVITATION_CODE,
  ERROR_INVLAID_CODE,
  ERROR_VERIFICATION_FAILED_SHORT,
} from '../../constants/strings';

type InvitationCodeVerificationScreenNavigationProp = StackNavigationProp<
  OnboardingStackParams,
  'InvitationCodeVerification'
>;

interface InvitationCodeVerificationProps {
  navigation: InvitationCodeVerificationScreenNavigationProp;
}

/**
 * InvitationCodeVerification screen to verify that the new user has been Invited
 * @param navigation react-navigation navigation object
 */

const InvitationCodeVerification: React.FC<InvitationCodeVerificationProps> = ({
  navigation,
}) => {
  const [value, setValue] = React.useState('');
  const ref = useBlurOnFulfill({value, cellCount: 6});
  const [valueProps, getCellOnLayoutHandler] = useClearByFocusCell({
    value,
    setValue,
  });

  const handleInvitationCodeVerification = async () => {
    if (value.length === 6) {
      try {
        let verifyInviteCodeResponse = await fetch(
          VERIFY_INVITATION_CODE_ENDPOUNT + value + '/',
          {
            method: 'DELETE',
          },
        );

        if (verifyInviteCodeResponse.status === 200) {
          navigation.navigate('RegistrationOne');
        } else {
          Alert.alert(ERROR_INVALID_INVITATION_CODE);
        }
      } catch (error) {
        Alert.alert(
          ERROR_VERIFICATION_FAILED_SHORT,
          ERROR_DOUBLE_CHECK_CONNECTION,
        );
        return {
          name: 'Verification error',
          description: error,
        };
      }
    } else {
      Alert.alert(ERROR_INVLAID_CODE);
    }
  };

  const navigateToAddWaitList = () => {
    navigation.navigate('AddWaitlistUser');
  };

  const Footer = () => (
    <View style={styles.footer}>
      <ArrowButton
        direction="backward"
        onPress={() => navigation.navigate('Login')}
      />
    </View>
  );

  return (
    <Background
      centered
      style={styles.container}
      gradientType={BackgroundGradientType.Light}>
      <RegistrationWizard style={styles.wizard} step="one" />
      <KeyboardAvoidingView behavior="padding" style={styles.form}>
        <Text style={styles.formHeader}>Enter the code</Text>
        <Text style={styles.description}>
          Please enter the invitation code provided to you by us / your friend.
          (Use all caps.)
        </Text>
        <CodeField
          ref={ref}
          {...valueProps}
          value={value}
          onChangeText={setValue}
          cellCount={6}
          rootStyle={styles.codeFieldRoot}
          textContentType="oneTimeCode"
          renderCell={({index, symbol, isFocused}) => (
            <View
              onLayout={getCellOnLayoutHandler(index)}
              key={index}
              style={[styles.cellRoot, isFocused && styles.focusCell]}>
              <Text style={styles.cellText}>
                {symbol || (isFocused ? <Cursor /> : null)}
              </Text>
            </View>
          )}
        />
        <SubmitButton
          text="Verify"
          color="#fff"
          style={styles.button}
          accessibilityLabel="Verify"
          accessibilityHint="Select this after entering your invitation code"
          onPress={handleInvitationCodeVerification}
        />
        <View style={styles.noInviteCode}>
          <Text style={styles.inviteCodeText}>Don't have an invite? </Text>
          <Text style={styles.inviteCodeLink} onPress={navigateToAddWaitList}>
            {' '}
            Join the Waitlist
          </Text>
        </View>
        <LoadingIndicator />
      </KeyboardAvoidingView>
      <Footer />
    </Background>
  );
};

const styles = StyleSheet.create({
  container: {
    flex: 1,
    alignItems: 'center',
    justifyContent: 'center',
  },
  wizard: {
    marginTop: '3.5%',
    flex: 1,
    justifyContent: 'center',
  },
  form: {
    alignItems: 'center',
    justifyContent: 'flex-start',
    flex: 3,
  },
  formHeader: {
    color: '#fff',
    fontSize: 20,
    fontWeight: 'bold',
    alignSelf: 'flex-start',
    marginBottom: '6%',
    marginHorizontal: '10%',
  },
  description: {
    color: '#fff',
    fontWeight: '600',
    fontSize: 17,
    marginHorizontal: '10%',
  },
  codeFieldRoot: {
    width: 280,
    marginHorizontal: 'auto',
    marginVertical: '15%',
  },
  cellRoot: {
    width: 40,
    height: 60,
    justifyContent: 'center',
    alignItems: 'center',
    borderBottomColor: '#fff',
    borderBottomWidth: 1,
  },
  cellText: {
    color: '#fff',
    fontSize: 48,
    textAlign: 'center',
  },
  focusCell: {
    borderBottomColor: '#78a0ef',
    borderBottomWidth: 2,
  },
  button: {
    marginVertical: '5%',
  },
  footer: {
    width: '100%',
    flexDirection: 'row',
    justifyContent: 'space-around',
    ...Platform.select({
      ios: {
        bottom: '20%',
      },
      android: {
        bottom: '10%',
      },
    }),
  },
  noInviteCode: {
    flexDirection: 'row',
    justifyContent: 'center',
  },
  inviteCodeText: {
    color: TAGG_LIGHT_PURPLE,
    fontSize: 18,
  },
  inviteCodeLink: {
    color: 'white',
    fontSize: 18,
    textDecorationLine: 'underline',
  },
});

export default InvitationCodeVerification;
