const React = require('react');
const { View, Text, Image, Animated } = require('react-native');

const Reanimated = {
  default: {
    View,
    Text,
    Image,
    ScrollView: Animated.ScrollView,
    createAnimatedComponent: (component) => component,
    spring: jest.fn(),
    timing: jest.fn(),
    decay: jest.fn(),
    sequence: jest.fn(),
    parallel: jest.fn(),
    delay: jest.fn(),
    loop: jest.fn(),
    event: jest.fn(),
    call: jest.fn(),
    block: jest.fn(),
    cond: jest.fn(),
    eq: jest.fn(),
    neq: jest.fn(),
    and: jest.fn(),
    or: jest.fn(),
    defined: jest.fn(),
    not: jest.fn(),
    set: jest.fn(),
    concat: jest.fn(),
    add: jest.fn(),
    sub: jest.fn(),
    multiply: jest.fn(),
    divide: jest.fn(),
    pow: jest.fn(),
    modulo: jest.fn(),
    sqrt: jest.fn(),
    sin: jest.fn(),
    cos: jest.fn(),
    tan: jest.fn(),
    acos: jest.fn(),
    asin: jest.fn(),
    atan: jest.fn(),
    proc: jest.fn(),
    useCode: jest.fn(),
    useValue: jest.fn(() => new Animated.Value(0)),
    interpolateNode: jest.fn(),
    Extrapolate: { CLAMP: jest.fn() },
    Value: Animated.Value,
    Clock: jest.fn(),
    interpolate: jest.fn(),
    Easing: Animated.Easing,
  },
  useSharedValue: jest.fn(() => ({ value: 0 })),
  useAnimatedStyle: jest.fn((cb) => cb()),
  useAnimatedGestureHandler: jest.fn(),
  useAnimatedScrollHandler: jest.fn(),
  withTiming: jest.fn((value) => value),
  withSpring: jest.fn((value) => value),
  withDecay: jest.fn((value) => value),
  withDelay: jest.fn((delay, value) => value),
  withSequence: jest.fn((...args) => args[0]),
  withRepeat: jest.fn((value) => value),
  cancelAnimation: jest.fn(),
  runOnJS: jest.fn((fn) => fn),
  runOnUI: jest.fn((fn) => fn),
  Easing: Animated.Easing,
  EasingNode: Animated.Easing,
};

module.exports = Reanimated;
