import * as R from "ramda";

import { NetInfoState } from "@react-native-community/netinfo";
import { platformSelect } from "@applicaster/zapp-react-native-utils/reactUtils";
import { isOnline as isOnlineUtils } from "@applicaster/quick-brick-core/App/NetworkStatusProvider/utils";
import { useSafeAreaInsets } from "react-native-safe-area-context";
import { Platform } from "react-native";

type ConnectionInfo = NetInfoState & { deviceStatus: NetStatus };
type Return = {
  online: Nullable<boolean>;
  deviceOnline: Nullable<boolean>;
};

const parseConnectionInfoForDefault = (
  connectionInfo: ConnectionInfo
): Return => {
  const deviceOnline = connectionInfo?.deviceStatus?.online;
  const online = deviceOnline || isOnlineUtils(connectionInfo);

  return { online, deviceOnline };
};

const isTrue = R.equals(true);
const isAllTrue = R.all(isTrue);

const parseConnectionInfoForSamsung = (
  connectionInfo: ConnectionInfo
): Return => {
  const { isConnected, isInternetReachable } = connectionInfo;
  const online = R.pathOr(true, ["deviceStatus", "online"], connectionInfo);

  const networkStatusProps = [isConnected, online];

  const osVersion = Platform.Version as string;
  const platformOS = Platform.OS as QuickBrickPlatforms;

  const parsedOsVersion = parseFloat(osVersion);

  if (!(platformOS === "samsung_tv" && parsedOsVersion <= 5.0)) {
    networkStatusProps.push(isInternetReachable);
  }

  const isOnline = isAllTrue(networkStatusProps);

  return { online: isOnline, deviceOnline: isOnline };
};

export const parseConnectionInfo: typeof parseConnectionInfoForDefault =
  platformSelect({
    samsung_tv: parseConnectionInfoForSamsung,
    default: parseConnectionInfoForDefault,
  });

export const useNotificationHeight = () => {
  const insets = useSafeAreaInsets();

  const navBarHeight = platformSelect({ ios: 44, android: 56 });

  const statusHeight = Platform.OS === "android" ? 0 : insets.top;
  const notificationHeight = statusHeight + navBarHeight;

  return { statusHeight, notificationHeight };
};
