import React from 'react';
import { createStackNavigator } from '@react-navigation/stack';
import { connect } from 'react-redux';
import PropTypes from 'prop-types';

import { ThemeContext } from '../theme';
import {
	defaultHeader, themedHeader, StackAnimation, ModalAnimation
} from '../utils/navigation';

// Outside Stack
import OnboardingView from '../views/OnboardingView';
import NewServerView from '../views/NewServerView';
import WorkspaceView from '../views/WorkspaceView';
import LoginView from '../views/LoginView';
import ForgotPasswordView from '../views/ForgotPasswordView';
import RegisterView from '../views/RegisterView';
import LegalView from '../views/LegalView';
import AuthenticationWebView from '../views/AuthenticationWebView';
import { ROOT_OUTSIDE } from '../actions/app';

// Outside
const Outside = createStackNavigator();
const _OutsideStack = ({ root }) => {
	const { theme } = React.useContext(ThemeContext);

	return (
		<Outside.Navigator screenOptions={{ ...defaultHeader, ...themedHeader(theme), ...StackAnimation }}>
			{root === ROOT_OUTSIDE ? (
				<Outside.Screen
					name='OnboardingView'
					component={OnboardingView}
					options={OnboardingView.navigationOptions}
				/>
			) : null}
			<Outside.Screen
				name='NewServerView'
				component={NewServerView}
				options={NewServerView.navigationOptions}
			/>
			<Outside.Screen
				name='WorkspaceView'
				component={WorkspaceView}
				options={WorkspaceView.navigationOptions}
			/>
			<Outside.Screen
				name='LoginView'
				component={LoginView}
				options={LoginView.navigationOptions}
			/>
			<Outside.Screen
				name='ForgotPasswordView'
				component={ForgotPasswordView}
				options={ForgotPasswordView.navigationOptions}
			/>
			<Outside.Screen
				name='RegisterView'
				component={RegisterView}
				options={RegisterView.navigationOptions}
			/>
			<Outside.Screen
				name='LegalView'
				component={LegalView}
				options={LegalView.navigationOptions}
			/>
		</Outside.Navigator>
	);
};

const mapStateToProps = state => ({
	root: state.app.root
});

_OutsideStack.propTypes = {
	root: PropTypes.string
};

const OutsideStack = connect(mapStateToProps)(_OutsideStack);

// OutsideStackModal
const OutsideModal = createStackNavigator();
const OutsideStackModal = () => {
	const { theme } = React.useContext(ThemeContext);

	return (
		<OutsideModal.Navigator mode='modal' screenOptions={{ ...defaultHeader, ...themedHeader(theme), ...ModalAnimation }}>
			<OutsideModal.Screen
				name='OutsideStack'
				component={OutsideStack}
				options={{ headerShown: false }}
			/>
			<OutsideModal.Screen
				name='AuthenticationWebView'
				component={AuthenticationWebView}
				options={AuthenticationWebView.navigationOptions}
			/>
		</OutsideModal.Navigator>
	);
};

export default OutsideStackModal;