import { useState, useEffect, useCallback } from 'react';
import axios from 'axios';

export type PermissionLevel = 'zeiterfassung' | 'zeiterfassung_planner' | 'zeiterfassung_admin' | null;

export interface UserPermissions {
  userId: number | null;
  level: PermissionLevel;
  hasAccess: boolean;
  hasPlannerAccess: boolean;
  hasAdminAccess: boolean;
}

interface UseUserPermissionsReturn {
  permissions: UserPermissions;
  loading: boolean;
  error: string | null;
  refetch: () => Promise<void>;
}

const defaultPermissions: UserPermissions = {
  userId: null,
  level: null,
  hasAccess: false,
  hasPlannerAccess: false,
  hasAdminAccess: false,
};

/**
 * Hook to fetch and manage user permissions for Zeiterfassung module
 *
 * Permission levels:
 * - zeiterfassung: Normal user - dashboard only access
 * - zeiterfassung_planner: Planner - can manage shifts, users, schedules
 * - zeiterfassung_admin: Admin - full access including user activation and company settings
 */
export function useUserPermissions(): UseUserPermissionsReturn {
  const [permissions, setPermissions] = useState<UserPermissions>(defaultPermissions);
  const [loading, setLoading] = useState(true);
  const [error, setError] = useState<string | null>(null);

  const fetchPermissions = useCallback(async () => {
    try {
      setLoading(true);
      setError(null);

      const response = await axios.get('/zeiterfassung/my-permissions');
      const data = response.data;

      const perms = {
        userId: data.user_id,
        level: data.level,
        hasAccess: data.has_access,
        hasPlannerAccess: data.has_planner_access,
        hasAdminAccess: data.has_admin_access,
      };

      setPermissions(perms);
    } catch (err: any) {
      console.error('Failed to fetch user permissions:', err);
      setError(err.response?.data?.message || 'Failed to load permissions');
      // Set default no-access permissions on error
      setPermissions(defaultPermissions);
    } finally {
      setLoading(false);
    }
  }, []);

  useEffect(() => {
    fetchPermissions();
  }, [fetchPermissions]);

  return {
    permissions,
    loading,
    error,
    refetch: fetchPermissions,
  };
}

export default useUserPermissions;
