import type { Role } from "@/db/types";

/** Marketplace roles (guests / hosts). */
export const MARKETPLACE_ROLES = ["CUSTOMER", "OWNER"] as const;

/** Staff / admin-panel roles. */
export const STAFF_ROLES = [
  "SUPER_ADMIN",
  "FINANCE_ADMIN",
  "OPERATIONS_ADMIN",
  "VIEWER",
  "ADMIN", // legacy — migrated to SUPER_ADMIN
] as const;

export type StaffRole = (typeof STAFF_ROLES)[number];

export type AdminPermission =
  | "overview"
  | "bookings"
  | "bookings:write"
  | "payments"
  | "withdrawals"
  | "withdrawals:write"
  | "reconciliation"
  | "refunds:write"
  | "properties"
  | "properties:write"
  | "reviews"
  | "reviews:write"
  | "users"
  | "users:write"
  | "wallets"
  | "wallets:write"
  | "coupons"
  | "coupons:write"
  | "refundPolicy"
  | "refundPolicy:write"
  | "commerce"
  | "commerce:write"
  | "rates"
  | "rates:write"
  | "messages"
  | "messages:write"
  | "team"
  | "team:write"
  | "activity";

const ALL: AdminPermission[] = [
  "overview",
  "bookings",
  "bookings:write",
  "payments",
  "withdrawals",
  "withdrawals:write",
  "reconciliation",
  "refunds:write",
  "properties",
  "properties:write",
  "reviews",
  "reviews:write",
  "users",
  "users:write",
  "wallets",
  "wallets:write",
  "coupons",
  "coupons:write",
  "refundPolicy",
  "refundPolicy:write",
  "commerce",
  "commerce:write",
  "rates",
  "rates:write",
  "messages",
  "messages:write",
  "team",
  "team:write",
  "activity",
];

const FINANCE: AdminPermission[] = [
  "overview",
  "payments",
  "withdrawals",
  "withdrawals:write",
  "reconciliation",
  "refunds:write",
  "bookings", // needed to open bookings for refunds
  "wallets",
  "wallets:write",
  "coupons",
  "coupons:write",
  "refundPolicy",
  "refundPolicy:write",
  "rates",
  "rates:write",
  "activity",
];

const OPERATIONS: AdminPermission[] = [
  "overview",
  "bookings",
  "bookings:write",
  "properties",
  "properties:write",
  "reviews",
  "reviews:write",
  "users",
  "users:write",
  "messages",
  "messages:write",
];

const VIEWER_READ: AdminPermission[] = [
  "overview",
  "bookings",
  "payments",
  "withdrawals",
  "reconciliation",
  "properties",
  "reviews",
  "users",
  "wallets",
  "coupons",
  "refundPolicy",
  "commerce",
  "rates",
  "messages",
];

const ROLE_PERMISSIONS: Record<string, AdminPermission[]> = {
  SUPER_ADMIN: ALL,
  ADMIN: ALL, // legacy
  FINANCE_ADMIN: FINANCE,
  OPERATIONS_ADMIN: OPERATIONS,
  VIEWER: VIEWER_READ,
};

export function isStaffRole(role: string | undefined | null): boolean {
  if (!role) return false;
  return (STAFF_ROLES as readonly string[]).includes(role);
}

export function normalizeStaffRole(role: string): string {
  return role === "ADMIN" ? "SUPER_ADMIN" : role;
}

export function permissionsForRole(role: string | undefined | null): AdminPermission[] {
  if (!role) return [];
  const key = normalizeStaffRole(role);
  return ROLE_PERMISSIONS[key] || [];
}

export function hasAdminPermission(role: string | undefined | null, permission: AdminPermission) {
  return permissionsForRole(role).includes(permission);
}

export function hasRole(userRole: Role | string, allowed: Array<Role | string>) {
  if (allowed.includes(userRole)) return true;
  // Routes that historically required ADMIN accept any staff role
  if (allowed.includes("ADMIN") && isStaffRole(userRole)) return true;
  // Legacy ADMIN token treated as SUPER_ADMIN for staff-only checks
  if (userRole === "ADMIN" && allowed.some((r) => isStaffRole(String(r)))) return true;
  if (userRole === "SUPER_ADMIN" && allowed.includes("ADMIN")) return true;
  return false;
}
