import type { LayoutChangeEvent } from "react-native";
import type { SharedValue } from "react-native-reanimated";

type KeyboardLiftBehavior = "always" | "whenAtEnd" | "persistent" | "never";

type UseChatKeyboardOptions = {
  inverted: boolean;
  keyboardLiftBehavior: KeyboardLiftBehavior;
  freeze: SharedValue<boolean>;
  offset: number;
  blankSpace: SharedValue<number>;
  /** Extra content padding shared value — needed on iOS to correctly clamp contentOffset. */
  extraContentPadding: SharedValue<number>;
};

type UseChatKeyboardReturn = {
  /** Extra scrollable space (= keyboard height). Used as contentInset on iOS, contentInsetBottom/contentInsetTop on Android. */
  padding: SharedValue<number>;
  /** Raw keyboard height updated every frame in onMove. Used to force Reanimated commits on Fabric. */
  currentHeight: SharedValue<number>;
  /** Absolute Y content offset for iOS (set once in onStart). `undefined` on Android. */
  contentOffsetY: SharedValue<number> | undefined;
  /** Current vertical scroll offset. */
  scroll: SharedValue<number>;
  /** Visible viewport dimensions. */
  layout: SharedValue<{ width: number; height: number }>;
  /** Total content dimensions. */
  size: SharedValue<{ width: number; height: number }>;
  /** Callback to attach to ScrollView's onLayout prop to capture initial viewport dimensions. */
  onLayout: (e: LayoutChangeEvent) => void;
  /** Callback to attach to ScrollView's onContentSizeChange prop to capture initial content dimensions. */
  onContentSizeChange: (w: number, h: number) => void;
};

export type {
  KeyboardLiftBehavior,
  UseChatKeyboardOptions,
  UseChatKeyboardReturn,
};
