import type { FastifyInstance, FastifyReply, FastifyRequest } from "fastify";
import { type Permission, type Role } from "@familyalbum/shared";
declare module "fastify" {
    interface FastifyRequest {
        familyContext?: {
            familyId: string;
            userId: string;
            role: Role;
            /** Droits viewer (view = base + options) — ignoré pour les gestionnaires. */
            permission: Permission;
        };
    }
}
export interface RequireFamilyOptions {
    /** Nom du paramètre de route portant le familyId (ex: "familyId"). */
    familyParam?: string;
    /** Nom du paramètre de route portant le mediaId (résolu vers sa famille). */
    mediaParam?: string;
    /** Nom du paramètre de route portant l'albumId (résolu vers sa famille). */
    albumParam?: string;
    /** Rôle minimum (viewer < coadmin < admin). */
    minRole?: Role;
    /**
     * Statut minimum : "full" exige canSocial() (gestionnaire ou viewer full),
     * "download" exige canDownload() (gestionnaire ou viewer non-« visu seul »).
     */
    minPermission?: Permission;
}
/**
 * Hooks du module PrivateFamily. `requireFamilyMember` est la barrière
 * d'appartenance (rôle + statut) — sans RLS ici : une famille par serveur,
 * la vérification applicative suffit.
 */
export declare function buildFamilyAuthHooks(app: FastifyInstance): {
    requireFamilyMember(opts?: RequireFamilyOptions): (request: FastifyRequest, reply: FastifyReply) => Promise<void>;
};
