export type RoleStatus = "Active" | "Inactive";

export type ApiRole = {
  id: number;
  name: string;
  guardName: string;
  createdAt: string;
  updatedAt: string;
  deletedAt?: string | null;
  permissions?: unknown[] | number;
  resources?: unknown[] | number;
  _count?: {
    permissions?: number;
    resources?: number;
  };
};

export type Role = {
  id: number;
  role: string;
  guardName: string;
  status: RoleStatus;
  permissions: number;
  resources: number;
  updated: string;
};

export type ApiResponse<T> = {
  success: boolean;
  statusCode: number;
  message: string;
  data: T;
};

// A permission as returned by GET /permissions and nested in a role detail.
export type ApiPermission = {
  id: number;
  name: string;
  guardName?: string;
};

export type Permission = {
  id: number;
  name: string;
  guardName?: string;
};

export type PermissionActionKey =
  | "read"
  | "create"
  | "update"
  | "delete"
  | "export";

export type PermissionMatrixItem = {
  id: number;
  name: string;
  label: string;
};

export type PermissionMatrixResource = {
  resource: string;
  label: string;
  order: number;
  permissions: Partial<Record<PermissionActionKey, PermissionMatrixItem>>;
};

export type PermissionMatrixResponse = {
  resources: PermissionMatrixResource[];
};

// GET /roles/:id payload: the role plus its assigned permissions.
export type ApiRoleDetail = {
  id: number;
  name: string;
  guardName: string;
  permissions?: ApiPermission[];
};

// The shape the create/edit dialog edits.
export type RoleDetail = {
  id: number;
  name: string;
  guardName: string;
  permissions: Permission[];
  permissionIds: number[];
};

export type SaveRolePayload = {
  name: string;
  guardName?: string;
  permissionIds: number[];
};
