import BottomSheet, { BottomSheetScrollView } from "@gorhom/bottom-sheet";
import { router } from "expo-router";
import { useRef, type PropsWithChildren } from "react";
import { Image, Text, TouchableOpacity, View } from "react-native";
import { GestureHandlerRootView } from "react-native-gesture-handler";
import { useSafeAreaInsets } from "react-native-safe-area-context";

import { icons } from "@/constants";
import { tr } from "@/lib/i18n";
import { useTheme } from "@/lib/theme";

import { Map } from "./map";

type RideLayoutProps = {
  title?: string;
  snapPoints?: string[];
};

export const RideLayout = ({
  title,
  snapPoints,
  children,
}: PropsWithChildren<RideLayoutProps>) => {
  const bottomSheetRef = useRef<BottomSheet>(null);
  const { isDark } = useTheme();
  const insets = useSafeAreaInsets();

  return (
    <GestureHandlerRootView>
      <View className="flex-1 bg-white dark:bg-neutral-950">
        <View className="flex flex-col h-screen bg-blue-500 dark:bg-neutral-900">
          <View className="flex flex-row absolute z-10 top-16 items-center justify-start px-5">
            <TouchableOpacity onPress={() => router.back()}>
              <View className="w-10 h-10 bg-white dark:bg-neutral-900 rounded-full items-center justify-center">
                <Image
                  source={icons.backArrow}
                  alt={tr("components.rideLayout.backArrowAlt")}
                  resizeMode="contain"
                  className="w-6 h-6"
                />
              </View>
            </TouchableOpacity>

            <Text className="text-xl font-JakartaSemiBold ml-5 text-black dark:text-white">
              {title ?? tr("components.rideLayout.goBack")}
            </Text>
          </View>

          <Map />
        </View>

        <BottomSheet
          keyboardBehavior="extend"
          ref={bottomSheetRef}
          snapPoints={snapPoints ?? ["40%", "85%"]}
          index={0}
          backgroundStyle={{ backgroundColor: isDark ? "#0a0a0a" : "#ffffff" }}
          handleIndicatorStyle={{
            backgroundColor: isDark ? "#525252" : "#d4d4d4",
          }}
        >
          {/* Scrollable rather than a plain view: the keyboard takes half the
              screen while the rider is typing an address, and everything below
              the field it covers — the fare, "Find now" — was simply out of
              reach until they dismissed it. The bottom inset keeps the button
              clear of the Android gesture bar. */}
          <BottomSheetScrollView
            style={{ flex: 1 }}
            contentContainerStyle={{
              padding: 20,
              paddingBottom: 20 + insets.bottom,
            }}
            keyboardShouldPersistTaps="handled"
          >
            {children}
          </BottomSheetScrollView>
        </BottomSheet>
      </View>
    </GestureHandlerRootView>
  );
};
