/*
 * File: navigationUtils.ts
 * Description: Navigation utility functions for AI Prediction module
 * Design & Developed by Tech4Biz Solutions
 * Copyright (c) Spurrin Innovations. All rights reserved.
 */

import { CommonActions } from '@react-navigation/native';
import type { AIPredictionStackParamList } from './navigationTypes';

// ============================================================================
// NAVIGATION UTILITY FUNCTIONS
// ============================================================================

/**
 * Navigate to AI Prediction Details
 * 
 * Purpose: Navigate to AI prediction case details screen
 * 
 * @param navigation - Navigation object
 * @param caseId - AI prediction case ID
 */
export const navigateToAIPredictionDetails = (
  navigation: any,
  caseId: string
) => {
  navigation.navigate('AIPredictionDetails', { caseId });
};

/**
 * Navigate to AI Prediction Filters
 * 
 * Purpose: Navigate to advanced filters screen
 * 
 * @param navigation - Navigation object
 */
export const navigateToAIPredictionFilters = (navigation: any) => {
  navigation.navigate('AIPredictionFilters');
};

/**
 * Navigate to AI Prediction Statistics
 * 
 * Purpose: Navigate to detailed statistics screen
 * 
 * @param navigation - Navigation object
 * @param timeRange - Optional time range filter
 */
export const navigateToAIPredictionStats = (
  navigation: any,
  timeRange?: 'today' | 'week' | 'month'
) => {
  navigation.navigate('AIPredictionStats', { timeRange });
};

/**
 * Go Back to AI Prediction List
 * 
 * Purpose: Navigate back to AI prediction list screen
 * 
 * @param navigation - Navigation object
 */
export const goBackToAIPredictionList = (navigation: any) => {
  navigation.navigate('AIPredictionList');
};

/**
 * Reset to AI Prediction List
 * 
 * Purpose: Reset navigation stack to AI prediction list
 * 
 * @param navigation - Navigation object
 */
export const resetToAIPredictionList = (navigation: any) => {
  navigation.dispatch(
    CommonActions.reset({
      index: 0,
      routes: [{ name: 'AIPredictionList' }],
    })
  );
};

/**
 * Can Go Back
 * 
 * Purpose: Check if navigation can go back
 * 
 * @param navigation - Navigation object
 * @returns Boolean indicating if can go back
 */
export const canGoBack = (navigation: any): boolean => {
  return navigation.canGoBack();
};

/**
 * Get Current Route Name
 * 
 * Purpose: Get the current route name
 * 
 * @param navigation - Navigation object
 * @returns Current route name or undefined
 */
export const getCurrentRouteName = (navigation: any): string | undefined => {
  return navigation.getCurrentRoute()?.name;
};

/**
 * Get Current Route Params
 * 
 * Purpose: Get the current route parameters
 * 
 * @param navigation - Navigation object
 * @returns Current route params or undefined
 */
export const getCurrentRouteParams = (navigation: any): any => {
  return navigation.getCurrentRoute()?.params;
};

/**
 * Navigate with Replace
 * 
 * Purpose: Navigate to a screen by replacing the current one
 * 
 * @param navigation - Navigation object
 * @param routeName - Route name to navigate to
 * @param params - Optional route parameters
 */
export const navigateWithReplace = (
  navigation: any,
  routeName: keyof AIPredictionStackParamList,
  params?: any
) => {
  navigation.replace(routeName, params);
};

/**
 * Navigate with Push
 * 
 * Purpose: Navigate to a screen by pushing it onto the stack
 * 
 * @param navigation - Navigation object
 * @param routeName - Route name to navigate to
 * @param params - Optional route parameters
 */
export const navigateWithPush = (
  navigation: any,
  routeName: keyof AIPredictionStackParamList,
  params?: any
) => {
  navigation.push(routeName, params);
};

/**
 * Pop Navigation Stack
 * 
 * Purpose: Pop the specified number of screens from the stack
 * 
 * @param navigation - Navigation object
 * @param count - Number of screens to pop (default: 1)
 */
export const popNavigationStack = (navigation: any, count: number = 1) => {
  navigation.pop(count);
};

/**
 * Pop to Top
 * 
 * Purpose: Pop to the top of the navigation stack
 * 
 * @param navigation - Navigation object
 */
export const popToTop = (navigation: any) => {
  navigation.popToTop();
};

/**
 * Set Navigation Params
 * 
 * Purpose: Set parameters for the current screen
 * 
 * @param navigation - Navigation object
 * @param params - Parameters to set
 */
export const setNavigationParams = (navigation: any, params: any) => {
  navigation.setParams(params);
};

/**
 * Add Navigation Listener
 * 
 * Purpose: Add a navigation event listener
 * 
 * @param navigation - Navigation object
 * @param eventName - Event name to listen for
 * @param callback - Callback function
 * @returns Unsubscribe function
 */
export const addNavigationListener = (
  navigation: any,
  eventName: string,
  callback: (e: any) => void
) => {
  return navigation.addListener(eventName, callback);
};

/**
 * Remove Navigation Listener
 * 
 * Purpose: Remove a navigation event listener
 * 
 * @param navigation - Navigation object
 * @param eventName - Event name
 * @param callback - Callback function
 */
export const removeNavigationListener = (
  navigation: any,
  eventName: string,
  callback: (e: any) => void
) => {
  navigation.removeListener(eventName, callback);
};

/**
 * Check if Screen is Focused
 * 
 * Purpose: Check if the current screen is focused
 * 
 * @param navigation - Navigation object
 * @returns Boolean indicating if screen is focused
 */
export const isScreenFocused = (navigation: any): boolean => {
  return navigation.isFocused();
};

/**
 * Get Navigation State
 * 
 * Purpose: Get the current navigation state
 * 
 * @param navigation - Navigation object
 * @returns Navigation state
 */
export const getNavigationState = (navigation: any) => {
  return navigation.getState();
};

/*
 * End of File: navigationUtils.ts
 * Design & Developed by Tech4Biz Solutions
 * Copyright (c) Spurrin Innovations. All rights reserved.
 */
