import { UserRole } from '@prisma/client';

const ROLE_PRIORITY: Record<string, number> = {
  SUPER_ADMIN: 5,
  INFLUENCE_ADMIN: 4,
  MAP_ADMIN: 4,
  BROADCAST_ADMIN: 4,
  CONTENT_ADMIN: 4,
  MEDIA_ADMIN: 4,
  PAYMENTS_ADMIN: 4,
  EVENTS_ADMIN: 4,
  SOCIAL_ADMIN: 4,
  POLLS_ADMIN: 4,
  ANALYTICS_ADMIN: 4,
  USER: 2,
  TEMP: 1,
};

/** All admin roles (any user with one of these can access /app) */
export const ADMIN_ROLES: UserRole[] = [
  UserRole.SUPER_ADMIN,
  UserRole.INFLUENCE_ADMIN,
  UserRole.MAP_ADMIN,
  UserRole.BROADCAST_ADMIN,
  UserRole.CONTENT_ADMIN,
  UserRole.MEDIA_ADMIN,
  UserRole.PAYMENTS_ADMIN,
  UserRole.EVENTS_ADMIN,
  UserRole.SOCIAL_ADMIN,
  UserRole.POLLS_ADMIN,
  UserRole.ANALYTICS_ADMIN,
];

// Module-specific role groups
export const INFLUENCE_ROLES: UserRole[] = [UserRole.SUPER_ADMIN, UserRole.INFLUENCE_ADMIN];
export const MAP_ROLES: UserRole[] = [UserRole.SUPER_ADMIN, UserRole.MAP_ADMIN];
export const BROADCAST_ROLES: UserRole[] = [UserRole.SUPER_ADMIN, UserRole.BROADCAST_ADMIN];
export const CONTENT_ROLES: UserRole[] = [UserRole.SUPER_ADMIN, UserRole.CONTENT_ADMIN];
export const MEDIA_ROLES: UserRole[] = [UserRole.SUPER_ADMIN, UserRole.MEDIA_ADMIN];
export const PAYMENTS_ROLES: UserRole[] = [UserRole.SUPER_ADMIN, UserRole.PAYMENTS_ADMIN];
export const EVENTS_ROLES: UserRole[] = [UserRole.SUPER_ADMIN, UserRole.EVENTS_ADMIN];
export const SOCIAL_ROLES: UserRole[] = [UserRole.SUPER_ADMIN, UserRole.SOCIAL_ADMIN];
export const SYSTEM_ROLES: UserRole[] = [UserRole.SUPER_ADMIN];
export const SCHEDULING_ROLES: UserRole[] = [UserRole.SUPER_ADMIN, UserRole.MAP_ADMIN, UserRole.EVENTS_ADMIN];
export const POLLS_ROLES: UserRole[] = [UserRole.SUPER_ADMIN, UserRole.POLLS_ADMIN, UserRole.INFLUENCE_ADMIN];
export const ANALYTICS_ROLES: UserRole[] = [UserRole.SUPER_ADMIN, UserRole.ANALYTICS_ADMIN];

/** Check if the user has any of the specified roles */
export function hasAnyRole(user: { roles?: unknown; role?: UserRole }, roles: UserRole[]): boolean {
  const userRoles = getUserRoles(user);
  return userRoles.some(r => roles.includes(r));
}

/** Check if user has any admin role */
export function isAdmin(user: { roles?: unknown; role?: UserRole }): boolean {
  return hasAnyRole(user, ADMIN_ROLES);
}

/** Get the primary (highest-priority) role from a roles array */
export function getPrimaryRole(roles: UserRole[]): UserRole {
  if (roles.length === 0) return UserRole.USER;
  return roles.reduce((highest, current) =>
    (ROLE_PRIORITY[current] || 0) > (ROLE_PRIORITY[highest] || 0) ? current : highest
  );
}

/** Safely extract UserRole[] from a user object (handles old single-role and new multi-role) */
export function getUserRoles(user: { roles?: unknown; role?: UserRole }): UserRole[] {
  if (Array.isArray(user.roles) && user.roles.length > 0) {
    return user.roles as UserRole[];
  }
  if (user.role) return [user.role];
  return [UserRole.USER];
}
