package com.reactnative.hybridnavigation;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import com.navigation.androidx.AwesomeFragment;
import com.navigation.androidx.StackFragment;
import com.navigation.androidx.TabBarItem;
import com.navigation.androidx.TransitionAnimation;

public class ReactStackFragment extends StackFragment {

    private final ReactManager reactManager = ReactManager.get();

    @Override
    public void setRootFragment(@NonNull AwesomeFragment fragment) {
        super.setRootFragment(fragment);
        if (fragment instanceof HybridFragment hybridFragment) {
			TabBarItem tabBarItem = hybridFragment.getTabBarItem();
            if (tabBarItem != null) {
                setTabBarItem(tabBarItem);
            }
        }
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        reactManager.watchMemory(this);
    }

    @Override
    protected void pushFragmentSync(AwesomeFragment fragment, @NonNull Runnable completion, @NonNull TransitionAnimation animation) {
        if (fragment instanceof ReactFragment reactFragment) {
			if (!reactFragment.shouldAnimatedTransition()) {
                super.pushFragmentSync(fragment, completion, TransitionAnimation.None);
                return;
            }
        }
        super.pushFragmentSync(fragment, completion, animation);
    }

    @Override
    protected void popToFragmentSync(AwesomeFragment fragment, @NonNull Runnable completion, @NonNull TransitionAnimation animation) {
        AwesomeFragment topFragment = getTopFragment();
        if (topFragment instanceof ReactFragment reactFragment) {
			if (!reactFragment.shouldAnimatedTransition()) {
                super.popToFragmentSync(fragment, completion, TransitionAnimation.None);
                return;
            }
        }
        super.popToFragmentSync(fragment, completion, animation);
    }

    @Override
    protected void redirectToFragmentSync(@NonNull AwesomeFragment fragment, @NonNull Runnable completion, @NonNull TransitionAnimation animation, @Nullable AwesomeFragment from) {
        if (fragment instanceof ReactFragment reactFragment) {
			if (!reactFragment.shouldAnimatedTransition()) {
                super.redirectToFragmentSync(fragment, completion, TransitionAnimation.None, from);
                return;
            }
        }
        super.redirectToFragmentSync(fragment, completion, animation, from);
    }
}
