import type { HttpContractConfig } from "../contracts/index.js";
import type {
  HttpRequestLike,
  HttpResponseLike,
  MaybePromise,
} from "./http.js";

export const responseFinalizerHook = Symbol(
  "@beignet/core/server/responseFinalizer",
);

export type ResponseFinalizerResponseOwner =
  | "route"
  | "framework"
  | "transport";

export type ResponseFinalizerValidationState =
  | "validated"
  | "disabled"
  | "not-applicable";

export type ResponseFinalizerHookArgs<Ctx> = {
  req: HttpRequestLike;
  ctx?: Ctx;
  contract: HttpContractConfig;
  path?: unknown;
  query?: unknown;
  headers?: unknown;
  body?: unknown;
  response: HttpResponseLike;
  error?: unknown;
  native?: boolean;
  owner: ResponseFinalizerResponseOwner;
  responseValidation: ResponseFinalizerValidationState;
};

export type ResponseFinalizerHook<Ctx> = (
  args: ResponseFinalizerHookArgs<Ctx>,
) => MaybePromise<void>;

export type ResponseFinalizerServerHook<Ctx> = {
  [responseFinalizerHook]?: ResponseFinalizerHook<Ctx>;
};

export function getResponseFinalizerHook<Ctx>(
  hook: unknown,
): ResponseFinalizerHook<Ctx> | undefined {
  return (hook as ResponseFinalizerServerHook<Ctx>)[responseFinalizerHook];
}
