import { IRepository } from './repository.interface';
import { User, PasswordResetToken } from '../../models/user.model';

/**
 * User Repository Interface
 * Defines operations for user management
 */
export interface IUserRepository extends IRepository<User> {
  /**
   * Find a user by email
   * @param email User email
   * @returns Promise resolving to user or null if not found
   */
  findByEmail(email: string): Promise<User | null>;

  /**
   * Update user's last login timestamp
   * @param userId User ID
   * @returns Promise resolving to updated user
   */
  updateLastLogin(userId: string): Promise<User | null>;

  /**
   * Change user's password
   * @param userId User ID
   * @param hashedPassword New hashed password
   * @returns Promise resolving to boolean indicating success
   */
  changePassword(userId: string, hashedPassword: string): Promise<boolean>;

  /**
   * Create a password reset token
   * @param userId User ID
   * @param token Reset token
   * @param expiresAt Expiration date
   * @returns Promise resolving to created token
   */
  createPasswordResetToken(
    userId: string,
    token: string,
    expiresAt: Date
  ): Promise<PasswordResetToken>;

  /**
   * Find password reset token
   * @param token Reset token
   * @returns Promise resolving to token or null if not found
   */
  findPasswordResetToken(token: string): Promise<PasswordResetToken | null>;

  /**
   * Delete password reset token
   * @param token Reset token
   * @returns Promise resolving to boolean indicating success
   */
  deletePasswordResetToken(token: string): Promise<boolean>;

  /**
   * Delete all password reset tokens for a user
   * @param userId User ID
   * @returns Promise resolving to boolean indicating success
   */
  deleteAllPasswordResetTokensForUser(userId: string): Promise<boolean>;

  /**
   * Activate user
   * @param userId User ID
   * @returns Promise resolving to updated user
   */
  activateUser(userId: string): Promise<User | null>;

  /**
   * Deactivate user
   * @param userId User ID
   * @returns Promise resolving to updated user
   */
  deactivateUser(userId: string): Promise<User | null>;

  /**
   * Update user roles
   * @param userId User ID
   * @param roles Array of role strings
   * @returns Promise resolving to updated user
   */
  updateRoles(userId: string, roles: string[]): Promise<User | null>;

  /**
   * Update user permissions
   * @param userId User ID
   * @param permissions Array of permission strings
   * @returns Promise resolving to updated user
   */
  updatePermissions(userId: string, permissions: string[]): Promise<User | null>;
}
