import { useState, useCallback } from 'react';
import { 
  getLocationData, 
  checkLocationPermission, 
  type LocationData, 
  type GeolocationError 
} from '@/lib/utils/locationUtils';

interface UseLocationReturn {
  locationData: LocationData | null;
  isLoading: boolean;
  error: string | null;
  permissionState: PermissionState | null;
  fetchLocation: () => Promise<void>;
  clearError: () => void;
  hasLocationData: boolean;
}

export const useLocation = (): UseLocationReturn => {
  const [locationData, setLocationData] = useState<LocationData | null>(null);
  const [isLoading, setIsLoading] = useState(false);
  const [error, setError] = useState<string | null>(null);
  const [permissionState, setPermissionState] = useState<PermissionState | null>(null);

  const fetchLocation = useCallback(async () => {
    setIsLoading(true);
    setError(null);

    try {
      // Check permission first
      const permission = await checkLocationPermission();
      setPermissionState(permission);

      if (permission === 'denied') {
        throw {
          code: 1,
          message: "Location access is required to submit this activity. Please enable location services."
        };
      }

      // Get location data
      const data = await getLocationData();
      setLocationData(data);
    } catch (err) {
      const error = err as GeolocationError;
      setError(error.message);
      setLocationData(null);
    } finally {
      setIsLoading(false);
    }
  }, []);

  const clearError = useCallback(() => {
    setError(null);
  }, []);

  const hasLocationData = locationData !== null;

  return {
    locationData,
    isLoading,
    error,
    permissionState,
    fetchLocation,
    clearError,
    hasLocationData
  };
};
