/**
 * Copyright (c) 2025 Huawei Technologies Co., Ltd.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
 */

import React, {useEffect, useState} from 'react';
import {Text, View} from 'react-native';
import {Driver} from '@rnoh/react-native-harmony-test-kit';

export const AppParamsContext = React.createContext(undefined);

export type EnvCtxType = {
  isConnectedToInternet: boolean;
  driver?: Driver;
};

const EnvCtx = React.createContext<EnvCtxType>({isConnectedToInternet: false});

async function checkIsInternetAvailable() {
  try {
    await fetch('https://www.gitcode.com', {
      method: 'HEAD',
    });
    return true;
  } catch (error) {
    return false;
  }
}

export const Environment = ({children}: {children: any}) => {
  const [internetAvailability, setInternetAvailability] = useState<
    'CHECKING' | 'AVAILABLE' | 'NOT_AVAILABLE'
  >('CHECKING');
  const [driver, setDriver] = useState<Driver>();

  useEffect(() => {
    (async () => {
      setInternetAvailability(
        (await checkIsInternetAvailable()) ? 'AVAILABLE' : 'NOT_AVAILABLE',
      );

      const driver_ = await Driver.create();
      setDriver(driver_);
    })();
  }, []);

  if (internetAvailability === 'CHECKING') {
    return (
      <View
        style={{
          justifyContent: 'center',
          alignItems: 'center',
          height: '100%',
        }}>
        <Text>Preparing testing environment...</Text>
      </View>
    );
  }

  return (
    <EnvCtx.Provider
      value={{
        isConnectedToInternet: internetAvailability === 'AVAILABLE',
        driver: driver,
      }}>
      {children}
    </EnvCtx.Provider>
  );
};

export function useEnvironment() {
  return {env: React.useContext(EnvCtx)!};
}