import React, { useState, useEffect } from 'react';
import { supabase } from '@/lib/supabase';
import * as AppleAuthentication from 'expo-apple-authentication';
import { useColorScheme } from '@/hooks/useColorScheme';
import { ThemedView } from '@/components/theme';
import { StyleSheet, Platform, Alert } from 'react-native';
import Constants from 'expo-constants';
import * as Notifications from 'expo-notifications';
import type { updateUser } from '@/constants/Types';

const AppleSignInButton = () => {
  const scheme = useColorScheme() ?? 'dark';

  const signInWithApple = async () => {
    try {
      const credential = await AppleAuthentication.signInAsync({
        requestedScopes: [
          AppleAuthentication.AppleAuthenticationScope.FULL_NAME,
          AppleAuthentication.AppleAuthenticationScope.EMAIL,
        ],
      });
      //const projectId = Constants.expoConfig?.extra?.projectId;
      //if (!projectId) throw new Error('No projectId found in expo.config.json');
      //const pushToken = await Notifications.getExpoPushTokenAsync({
      //projectId,
      //});
      if (credential.identityToken) {
        const email = credential.email;
        const full_name =
          credential.fullName && credential.fullName.givenName && credential.fullName.familyName
            ? `${credential.fullName.givenName} ${credential.fullName.familyName}`
            : null;

        const {
          error,
          data: { user, session },
        } = await supabase.auth.signInWithIdToken({
          provider: 'apple',
          token: credential.identityToken,
        });
        console.log(JSON.stringify({ error, user }, null, 2));
        if (!error && session) {
          if (email) {
            const data: updateUser = {
              id: session?.user.id,
              updated_at: new Date(),
              email,
              full_name: full_name ?? '',
              provider: 'apple',
            };
            const { error: updateError } = await supabase.auth.updateUser({ data });
            if (updateError) Alert.alert('Error updating auth info:', updateError.message);
            const { error: updateProfileError } = await supabase
              .from('profiles')
              .upsert({
                id: session?.user.id ?? '',
                updated_at: new Date(),
                email: email ?? '',
                full_name: full_name ?? '',
                provider: 'apple',
              });
            if (updateProfileError)
              Alert.alert('Error updating profile:', updateProfileError.message);
          }
        }
      } else {
        throw new Error('No identityToken.');
      }
    } catch (e: any) {
      if (e.code === 'ERR_REQUEST_CANCELED') {
        // handle that the user canceled the sign-in flow
        console.log('User canceled sign-in flow');
      } else {
        // handle other errors
        console.log('Error signing in with Apple:', e);
      }
    }
  };

  if (Platform.OS !== 'ios') return <ThemedView />;
  else
    return (
        <AppleAuthentication.AppleAuthenticationButton
          buttonType={AppleAuthentication.AppleAuthenticationButtonType.SIGN_IN}
          buttonStyle={
            scheme === 'light'
              ? AppleAuthentication.AppleAuthenticationButtonStyle.BLACK
              : AppleAuthentication.AppleAuthenticationButtonStyle.WHITE
          }
          cornerRadius={5}
          style={{ width: '85%', height: 64 }}
          onPress={signInWithApple}
        />
    );
};
export default AppleSignInButton;
