import { PaginatedResponse, ResponseData } from "../utils/responseData.js";
import { ShowcaseProjectAPI } from "../types/showcaseProject.types.js";
import { FastifyReply, FastifyRequest } from "fastify";
import { z } from "zod";

//#region src/controllers/showcaseProject.controller.d.ts
declare const submitProjectSchema: z.ZodObject<{
  name: z.ZodString;
  url: z.ZodURL;
  githubUrl: z.ZodPipe<z.ZodUnion<[z.ZodOptional<z.ZodURL>, z.ZodLiteral<"">]>, z.ZodTransform<string, string>>;
  useCases: z.ZodOptional<z.ZodArray<z.ZodString>>;
}, z.core.$strip>;
type SubmitShowcaseProjectBody = z.input<typeof submitProjectSchema>;
type SubmitShowcaseProjectResult = ResponseData<ShowcaseProjectAPI>;
/**
 * POST /api/showcase-project/submit
 * Submits a new project to the showcase.
 */
declare const submitShowcaseProject: (request: FastifyRequest<{
  Body: SubmitShowcaseProjectBody;
}>, reply: FastifyReply) => Promise<void>;
type GetShowcaseProjectsQuery = {
  page?: string;
  pageSize?: string;
  search?: string;
  selectedUseCases?: string | string[];
  isOpenSource?: string;
};
type GetShowcaseProjectsResult = PaginatedResponse<ShowcaseProjectAPI>;
/**
 * GET /api/showcase-project
 */
declare const getShowcaseProjects: (request: FastifyRequest<{
  Querystring: GetShowcaseProjectsQuery;
}>, reply: FastifyReply) => Promise<void>;
type GetShowcaseProjectByIdParams = {
  projectId: string;
};
type GetShowcaseProjectByIdResult = ResponseData<ShowcaseProjectAPI>;
/**
 * GET /api/showcase-project/:projectId
 */
declare const getShowcaseProjectById: (request: FastifyRequest<{
  Params: GetShowcaseProjectByIdParams;
}>, reply: FastifyReply) => Promise<void>;
type GetOtherShowcaseProjectsQuery = {
  excludeId: string;
  limit?: string;
};
type GetOtherShowcaseProjectsResult = ResponseData<ShowcaseProjectAPI[]>;
/**
 * GET /api/showcase-project/others?excludeId=...&limit=...
 */
declare const getOtherShowcaseProjects: (request: FastifyRequest<{
  Querystring: GetOtherShowcaseProjectsQuery;
}>, reply: FastifyReply) => Promise<void>;
type ToggleShowcaseUpvoteBody = {
  projectId: string;
};
type ToggleShowcaseUpvoteResult = ResponseData<{
  upvotes: number;
  isUpVoted: boolean;
  downvotes: number;
  isDownVoted: boolean;
}>;
/**
 * POST /api/showcase-project/upvote
 * Requires authentication — userId is read from the session.
 */
declare const toggleShowcaseUpvote: (request: FastifyRequest<{
  Body: ToggleShowcaseUpvoteBody;
}>, reply: FastifyReply) => Promise<void>;
type ToggleShowcaseDownvoteBody = {
  projectId: string;
};
type ToggleShowcaseDownvoteResult = ResponseData<{
  upvotes: number;
  isUpVoted: boolean;
  downvotes: number;
  isDownVoted: boolean;
}>;
/**
 * POST /api/showcase-project/downvote
 * Requires authentication — userId is read from the session.
 */
declare const toggleShowcaseDownvote: (request: FastifyRequest<{
  Body: ToggleShowcaseDownvoteBody;
}>, reply: FastifyReply) => Promise<void>;
declare const updateProjectSchema: z.ZodObject<{
  name: z.ZodOptional<z.ZodString>;
  url: z.ZodOptional<z.ZodURL>;
  githubUrl: z.ZodPipe<z.ZodOptional<z.ZodString>, z.ZodTransform<string, string>>;
  tagline: z.ZodOptional<z.ZodString>;
  description: z.ZodOptional<z.ZodString>;
  useCases: z.ZodOptional<z.ZodArray<z.ZodString>>;
}, z.core.$strip>;
type UpdateShowcaseProjectBody = z.input<typeof updateProjectSchema>;
type UpdateShowcaseProjectParams = {
  projectId: string;
};
type UpdateShowcaseProjectResult = ResponseData<ShowcaseProjectAPI>;
/**
 * PATCH /api/showcase-project/:projectId
 * Updates an existing project. Only the owner can update.
 */
declare const updateShowcaseProjectHandler: (request: FastifyRequest<{
  Params: UpdateShowcaseProjectParams;
  Body: UpdateShowcaseProjectBody;
}>, reply: FastifyReply) => Promise<void>;
type DeleteShowcaseProjectParams = {
  projectId: string;
};
/**
 * DELETE /api/showcase-project/:projectId
 * Deletes a project (DB + R2 screenshot). Only the owner can delete.
 */
declare const deleteShowcaseProjectHandler: (request: FastifyRequest<{
  Params: DeleteShowcaseProjectParams;
}>, reply: FastifyReply) => Promise<void>;
type ScanShowcaseProjectParams = {
  projectId: string;
};
/**
 * GET /api/showcase-project/:projectId/scan
 * SSE endpoint — streams scan progress to the owner.
 * Requires authentication: only the project owner can trigger the scan.
 */
declare const scanShowcaseProject: (request: FastifyRequest<{
  Params: ScanShowcaseProjectParams;
}>, reply: FastifyReply) => Promise<void>;
//#endregion
export { DeleteShowcaseProjectParams, GetOtherShowcaseProjectsQuery, GetOtherShowcaseProjectsResult, GetShowcaseProjectByIdParams, GetShowcaseProjectByIdResult, GetShowcaseProjectsQuery, GetShowcaseProjectsResult, ScanShowcaseProjectParams, SubmitShowcaseProjectBody, SubmitShowcaseProjectResult, ToggleShowcaseDownvoteBody, ToggleShowcaseDownvoteResult, ToggleShowcaseUpvoteBody, ToggleShowcaseUpvoteResult, UpdateShowcaseProjectBody, UpdateShowcaseProjectParams, UpdateShowcaseProjectResult, deleteShowcaseProjectHandler, getOtherShowcaseProjects, getShowcaseProjectById, getShowcaseProjects, scanShowcaseProject, submitShowcaseProject, toggleShowcaseDownvote, toggleShowcaseUpvote, updateShowcaseProjectHandler };
//# sourceMappingURL=showcaseProject.controller.d.ts.map