import { IRepository } from './repository.interface';
import { UserRestaurantAccess, UserAccessSummary } from '../../models/access.model';

/**
 * User Restaurant Access Repository Interface
 * Defines operations for managing user access to restaurants
 */
export interface IAccessRepository extends IRepository<UserRestaurantAccess> {
  /**
   * Find access entries by user ID
   * @param userId User ID
   * @returns Promise resolving to array of access entries
   */
  findByUserId(userId: string): Promise<UserRestaurantAccess[]>;

  /**
   * Find access entries by restaurant ID
   * @param restaurantId Restaurant ID
   * @param level Optional restaurant level filter
   * @returns Promise resolving to array of access entries
   */
  findByRestaurantId(
    restaurantId: string,
    level?: 'group' | 'brand' | 'outlet'
  ): Promise<UserRestaurantAccess[]>;

  /**
   * Find specific access entry
   * @param userId User ID
   * @param restaurantId Restaurant ID
   * @param level Restaurant level
   * @returns Promise resolving to access entry or null if not found
   */
  findSpecificAccess(
    userId: string,
    restaurantId: string,
    level: 'group' | 'brand' | 'outlet'
  ): Promise<UserRestaurantAccess | null>;

  /**
   * Check if user has access to a restaurant
   * @param userId User ID
   * @param restaurantId Restaurant ID
   * @param level Restaurant level
   * @returns Promise resolving to boolean indicating if user has access
   */
  hasAccess(
    userId: string,
    restaurantId: string,
    level: 'group' | 'brand' | 'outlet'
  ): Promise<boolean>;

  /**
   * Check if user has specific permission for a restaurant
   * @param userId User ID
   * @param restaurantId Restaurant ID
   * @param permission Permission to check
   * @returns Promise resolving to boolean indicating if user has permission
   */
  hasPermission(
    userId: string,
    restaurantId: string,
    permission: string
  ): Promise<boolean>;

  /**
   * Update permissions for a specific access entry
   * @param accessId Access entry ID
   * @param permissions Array of permission strings
   * @returns Promise resolving to updated access entry
   */
  updatePermissions(
    accessId: string,
    permissions: string[]
  ): Promise<UserRestaurantAccess | null>;

  /**
   * Add permissions to a specific access entry
   * @param accessId Access entry ID
   * @param permissions Array of permission strings to add
   * @returns Promise resolving to updated access entry
   */
  addPermissions(
    accessId: string,
    permissions: string[]
  ): Promise<UserRestaurantAccess | null>;

  /**
   * Remove permissions from a specific access entry
   * @param accessId Access entry ID
   * @param permissions Array of permission strings to remove
   * @returns Promise resolving to updated access entry
   */
  removePermissions(
    accessId: string,
    permissions: string[]
  ): Promise<UserRestaurantAccess | null>;

  /**
   * Get a summary of all restaurant access for a user
   * @param userId User ID
   * @returns Promise resolving to access summary
   */
  getUserAccessSummary(userId: string): Promise<UserAccessSummary | null>;

  /**
   * Revoke all access for a user
   * @param userId User ID
   * @returns Promise resolving to boolean indicating success
   */
  revokeAllAccessForUser(userId: string): Promise<boolean>;

  /**
   * Bulk assign access to multiple users
   * @param restaurantId Restaurant ID
   * @param level Restaurant level
   * @param userIds Array of user IDs
   * @param permissions Array of permission strings
   * @returns Promise resolving to array of created access entries
   */
  bulkAssignAccess(
    restaurantId: string,
    level: 'group' | 'brand' | 'outlet',
    userIds: string[],
    permissions: string[]
  ): Promise<UserRestaurantAccess[]>;
}
