import React from 'react';
import {NativeStackNavigationOptions} from '@react-navigation/native-stack';
import {BackButton, CloseButton} from '@components';
import i18next from '@config/i18n';
import {NavOptionsProps} from '@navigation/interfaces';
import {getScreenString} from '@shared/strings';
import {Screens} from '@shared/constants';
import {isAndroid} from '@shared/utils';
import {COLORS} from '@shared/theme';

import {navigationRef} from './navigator';
import {TRANSITION_SPEC} from './constants';
import {HeaderNavigation} from './HeaderNavigation';

interface BaseCustomOptions {
  headerTintColor?: string;
  backgroundColor?: string;
  isLogged?: boolean;
}

const getBaseOptions = ({
  headerTintColor = COLORS.grey[800],
  isLogged = true,
}: BaseCustomOptions = {}): NativeStackNavigationOptions => ({
  headerTintColor,
  headerShadowVisible: false,
  headerTitleAlign: 'center',
  headerBackButtonDisplayMode: 'minimal',
  headerLargeTitle: false,
  headerLargeTitleStyle: undefined,
  headerLargeStyle: undefined,
  headerSearchBarOptions: undefined,
  headerTransparent: false,
  headerBlurEffect: undefined,
  headerBackVisible: false,
  headerBackButtonMenuEnabled: false,
  freezeOnBlur: true,
  header: props => <HeaderNavigation {...props} />,
  headerLeft: ({canGoBack}) => {
    const onLeftPress = () => {
      if (canGoBack) {
        navigationRef.goBack();
      } else {
        navigationRef.reset({
          routes: [{name: Screens.TABS}],
          index: 0,
        });
      }
    };

    return isLogged ? (
      canGoBack ? (
        <BackButton onPress={onLeftPress} />
      ) : (
        <CloseButton onPress={onLeftPress} />
      )
    ) : null;
  },
});

export const defaultNavOptions = ({
  route,
}: NavOptionsProps): NativeStackNavigationOptions => {
  const title = i18next.t(getScreenString(route.name as Screens), '');

  return {
    ...getBaseOptions(),
    title,
    ...(!isAndroid && {transitionSpec: TRANSITION_SPEC}),
  };
};

export const moduleNavOptions =
  (
    module: string,
    extraOptions?: (props: NavOptionsProps) => NativeStackNavigationOptions,
  ) =>
  (props: NavOptionsProps): NativeStackNavigationOptions =>
    ({
      ...defaultNavOptions(props),
      ...(extraOptions && extraOptions(props)),
      module,
    } as NativeStackNavigationOptions);

export const authNavOptions = ({
  route,
}: NavOptionsProps): NativeStackNavigationOptions => {
  const title = i18next.t(getScreenString(route.name as Screens), '');
  return {
    ...getBaseOptions({isLogged: false}),
    headerLeft: () => null,
    title,
  };
};

export const notHeaderNavOptions: NativeStackNavigationOptions = {
  headerShown: false,
};

export const BOTTOM_DRAWER_OPTIONS: NativeStackNavigationOptions = {
  gestureEnabled: true,
  presentation: 'modal',
  gestureDirection: 'vertical',
};

export const getCloseRightScreenOptions = ({
  navigation,
}: NavOptionsProps): NativeStackNavigationOptions => ({
  headerLeft: () => null,
  headerRight: () => <CloseButton onPress={navigation?.goBack} />,
});
