import { z } from 'zod';
import { AccelbyteSDK, ApiArgs } from '@accelbyte/sdk';
import React from 'react';

declare enum TopicStatus {
    VISIBLE = "VISIBLE",
    HIDDEN = "HIDDEN"
}
declare enum ArticleStatus {
    DRAFT = "DRAFT",
    PUBLISHED = "PUBLISHED"
}
declare const Topic: z.ZodObject<{
    id: z.ZodString;
    name: z.ZodString;
    slug: z.ZodString;
    description: z.ZodNullable<z.ZodOptional<z.ZodString>>;
    status: z.ZodEnum<[TopicStatus.HIDDEN, TopicStatus.VISIBLE]>;
    icon: z.ZodNullable<z.ZodOptional<z.ZodString>>;
    displayOrder: z.ZodNumber;
    createdAt: z.ZodString;
    updatedAt: z.ZodString;
}, "strip", z.ZodTypeAny, {
    description?: string | null | undefined;
    icon?: string | null | undefined;
    status: TopicStatus;
    name: string;
    updatedAt: string;
    id: string;
    createdAt: string;
    displayOrder: number;
    slug: string;
}, {
    description?: string | null | undefined;
    icon?: string | null | undefined;
    status: TopicStatus;
    name: string;
    updatedAt: string;
    id: string;
    createdAt: string;
    displayOrder: number;
    slug: string;
}>;
interface Topic extends z.TypeOf<typeof Topic> {
}
declare const TopicList: z.ZodObject<{
    data: z.ZodArray<z.ZodObject<{
        id: z.ZodString;
        name: z.ZodString;
        slug: z.ZodString;
        description: z.ZodNullable<z.ZodOptional<z.ZodString>>;
        status: z.ZodEnum<[TopicStatus.HIDDEN, TopicStatus.VISIBLE]>;
        icon: z.ZodNullable<z.ZodOptional<z.ZodString>>;
        displayOrder: z.ZodNumber;
        createdAt: z.ZodString;
        updatedAt: z.ZodString;
    }, "strip", z.ZodTypeAny, {
        description?: string | null | undefined;
        icon?: string | null | undefined;
        status: TopicStatus;
        name: string;
        updatedAt: string;
        id: string;
        createdAt: string;
        displayOrder: number;
        slug: string;
    }, {
        description?: string | null | undefined;
        icon?: string | null | undefined;
        status: TopicStatus;
        name: string;
        updatedAt: string;
        id: string;
        createdAt: string;
        displayOrder: number;
        slug: string;
    }>, "many">;
    paging: z.ZodObject<{
        previous: z.ZodNullable<z.ZodOptional<z.ZodString>>;
        next: z.ZodNullable<z.ZodOptional<z.ZodString>>;
    }, "strip", z.ZodTypeAny, {
        next?: string | null | undefined;
        previous?: string | null | undefined;
    }, {
        next?: string | null | undefined;
        previous?: string | null | undefined;
    }>;
}, "strip", z.ZodTypeAny, {
    data: {
        description?: string | null | undefined;
        icon?: string | null | undefined;
        status: TopicStatus;
        name: string;
        updatedAt: string;
        id: string;
        createdAt: string;
        displayOrder: number;
        slug: string;
    }[];
    paging: {
        next?: string | null | undefined;
        previous?: string | null | undefined;
    };
}, {
    data: {
        description?: string | null | undefined;
        icon?: string | null | undefined;
        status: TopicStatus;
        name: string;
        updatedAt: string;
        id: string;
        createdAt: string;
        displayOrder: number;
        slug: string;
    }[];
    paging: {
        next?: string | null | undefined;
        previous?: string | null | undefined;
    };
}>;
interface TopicList extends z.TypeOf<typeof TopicList> {
}
declare const Article: z.ZodObject<{
    id: z.ZodString;
    title: z.ZodString;
    slug: z.ZodString;
    rawContent: z.ZodNullable<z.ZodOptional<z.ZodString>>;
    htmlContent: z.ZodNullable<z.ZodOptional<z.ZodString>>;
    status: z.ZodEnum<[ArticleStatus.DRAFT, ArticleStatus.PUBLISHED]>;
    metaDescription: z.ZodString;
    metaTitle: z.ZodString;
    createdAt: z.ZodString;
    updatedAt: z.ZodString;
    topic: z.ZodObject<Pick<{
        id: z.ZodString;
        name: z.ZodString;
        slug: z.ZodString;
        description: z.ZodNullable<z.ZodOptional<z.ZodString>>;
        status: z.ZodEnum<[TopicStatus.HIDDEN, TopicStatus.VISIBLE]>;
        icon: z.ZodNullable<z.ZodOptional<z.ZodString>>;
        displayOrder: z.ZodNumber;
        createdAt: z.ZodString;
        updatedAt: z.ZodString;
    }, "name" | "id" | "description" | "slug">, "strip", z.ZodTypeAny, {
        description?: string | null | undefined;
        name: string;
        id: string;
        slug: string;
    }, {
        description?: string | null | undefined;
        name: string;
        id: string;
        slug: string;
    }>;
}, "strip", z.ZodTypeAny, {
    htmlContent?: string | null | undefined;
    rawContent?: string | null | undefined;
    status: ArticleStatus;
    updatedAt: string;
    title: string;
    id: string;
    topic: {
        description?: string | null | undefined;
        name: string;
        id: string;
        slug: string;
    };
    createdAt: string;
    slug: string;
    metaDescription: string;
    metaTitle: string;
}, {
    htmlContent?: string | null | undefined;
    rawContent?: string | null | undefined;
    status: ArticleStatus;
    updatedAt: string;
    title: string;
    id: string;
    topic: {
        description?: string | null | undefined;
        name: string;
        id: string;
        slug: string;
    };
    createdAt: string;
    slug: string;
    metaDescription: string;
    metaTitle: string;
}>;
interface Article extends z.TypeOf<typeof Article> {
}
declare const ArticleList: z.ZodObject<{
    data: z.ZodArray<z.ZodObject<{
        id: z.ZodString;
        title: z.ZodString;
        slug: z.ZodString;
        rawContent: z.ZodNullable<z.ZodOptional<z.ZodString>>;
        htmlContent: z.ZodNullable<z.ZodOptional<z.ZodString>>;
        status: z.ZodEnum<[ArticleStatus.DRAFT, ArticleStatus.PUBLISHED]>;
        metaDescription: z.ZodString;
        metaTitle: z.ZodString;
        createdAt: z.ZodString;
        updatedAt: z.ZodString;
        topic: z.ZodObject<Pick<{
            id: z.ZodString;
            name: z.ZodString;
            slug: z.ZodString;
            description: z.ZodNullable<z.ZodOptional<z.ZodString>>;
            status: z.ZodEnum<[TopicStatus.HIDDEN, TopicStatus.VISIBLE]>;
            icon: z.ZodNullable<z.ZodOptional<z.ZodString>>;
            displayOrder: z.ZodNumber;
            createdAt: z.ZodString;
            updatedAt: z.ZodString;
        }, "name" | "id" | "description" | "slug">, "strip", z.ZodTypeAny, {
            description?: string | null | undefined;
            name: string;
            id: string;
            slug: string;
        }, {
            description?: string | null | undefined;
            name: string;
            id: string;
            slug: string;
        }>;
    }, "strip", z.ZodTypeAny, {
        htmlContent?: string | null | undefined;
        rawContent?: string | null | undefined;
        status: ArticleStatus;
        updatedAt: string;
        title: string;
        id: string;
        topic: {
            description?: string | null | undefined;
            name: string;
            id: string;
            slug: string;
        };
        createdAt: string;
        slug: string;
        metaDescription: string;
        metaTitle: string;
    }, {
        htmlContent?: string | null | undefined;
        rawContent?: string | null | undefined;
        status: ArticleStatus;
        updatedAt: string;
        title: string;
        id: string;
        topic: {
            description?: string | null | undefined;
            name: string;
            id: string;
            slug: string;
        };
        createdAt: string;
        slug: string;
        metaDescription: string;
        metaTitle: string;
    }>, "many">;
    paging: z.ZodObject<{
        previous: z.ZodNullable<z.ZodOptional<z.ZodString>>;
        next: z.ZodNullable<z.ZodOptional<z.ZodString>>;
    }, "strip", z.ZodTypeAny, {
        next?: string | null | undefined;
        previous?: string | null | undefined;
    }, {
        next?: string | null | undefined;
        previous?: string | null | undefined;
    }>;
}, "strip", z.ZodTypeAny, {
    data: {
        htmlContent?: string | null | undefined;
        rawContent?: string | null | undefined;
        status: ArticleStatus;
        updatedAt: string;
        title: string;
        id: string;
        topic: {
            description?: string | null | undefined;
            name: string;
            id: string;
            slug: string;
        };
        createdAt: string;
        slug: string;
        metaDescription: string;
        metaTitle: string;
    }[];
    paging: {
        next?: string | null | undefined;
        previous?: string | null | undefined;
    };
}, {
    data: {
        htmlContent?: string | null | undefined;
        rawContent?: string | null | undefined;
        status: ArticleStatus;
        updatedAt: string;
        title: string;
        id: string;
        topic: {
            description?: string | null | undefined;
            name: string;
            id: string;
            slug: string;
        };
        createdAt: string;
        slug: string;
        metaDescription: string;
        metaTitle: string;
    }[];
    paging: {
        next?: string | null | undefined;
        previous?: string | null | undefined;
    };
}>;
interface ArticleList extends z.TypeOf<typeof ArticleList> {
}
interface ArticlePayload extends Omit<Article, 'topic' | 'slug' | 'createdAt' | 'updatedAt' | 'rawContent' | 'htmlContent'> {
    rawContent: string;
    htmlContent: string;
    topicId: string;
}

interface SupportPageProps {
    manageArticleURL?: string;
    isAdminCanEdit?: boolean;
    initialTopics: TopicList;
    onLoadMore: (sdk: AccelbyteSDK) => void;
    isLoadingMore: boolean;
}

declare function SupportPageWidget(props: SupportPageProps): JSX.Element;
declare function SupportTopicCardSkeleton(): JSX.Element;

interface ArticlesPageProps {
    initialData: {
        topic: Topic | null;
        topics: TopicList;
        articles: ArticleList;
    };
    isLoadingMoreTopic: boolean;
    onLoadmoreTopic: (sdk: AccelbyteSDK) => void;
    isLoadingMoreArticle: boolean;
    onLoadmoreArticle: (sdk: AccelbyteSDK) => void;
}

declare function ArticlesPageWidget(props: ArticlesPageProps): JSX.Element;

interface ArticleDetailPageProps {
    initialArticle: Article | null;
    initialTopics: TopicList;
    isLoadingMoreTopic: boolean;
    onLoadmoreTopic: (sdk: AccelbyteSDK) => void;
}

declare function ArticleDetailPageWidget(props: ArticleDetailPageProps): JSX.Element;
declare function ArticleDetailSkeleton(): JSX.Element;

interface SupportCTAProps {
    CTAIcon?: React.ReactNode;
}

declare function SupportCTAWidget(props: SupportCTAProps): JSX.Element;

declare function ArticleListPageWidget(): JSX.Element;

declare function CreateArticlePageWidget(): JSX.Element;

declare function EditArticlePageWidget({ slug }: {
    slug: string;
}): JSX.Element;

declare function TopicListWidget(): JSX.Element;

declare function CreateTopicPageWidget(): JSX.Element;

interface EditTopicPageWidgetProps {
    slug: string;
}
declare function EditTopicPageWidget({ slug }: EditTopicPageWidgetProps): JSX.Element;

declare function ManageContentPageWidget({ children }: {
    children: React.ReactNode;
}): JSX.Element;

/**
 * NOT AUTO GENERATED
 */

declare function ArticlesApi(sdk: AccelbyteSDK, args?: ApiArgs): {
    getArticles: () => Promise<Article[]>;
    deleteArticle: (id: string) => Promise<unknown>;
    getArticleById: (id: string) => Promise<Article>;
    getArticleBySlug: (slug: string) => Promise<Article>;
    createArticle: (payload: Omit<ArticlePayload, 'id'>) => Promise<unknown>;
    updateArticle: (data: ArticlePayload) => Promise<unknown>;
    getPublicArticles: (queryParams?: {
        topicId?: string | undefined;
    } | undefined) => Promise<ArticleList>;
    getPublicArticleBySlug: (queryParams: {
        slug: string;
    }) => Promise<Article>;
};

declare function TopicsApi(sdk: AccelbyteSDK, args?: ApiArgs): {
    getTopics: () => Promise<Topic[]>;
    getTopicById: (id: string) => Promise<Topic>;
    getTopicBySlug: (slug: string) => Promise<Topic>;
    createTopic: (data: any) => Promise<Topic>;
    updateTopic: (id: string, data: any) => Promise<unknown>;
    deleteTopic: (id: string) => Promise<unknown>;
    getPublicTopics: (queryParams: {
        status?: keyof typeof TopicStatus;
        limit?: string;
    }) => Promise<TopicList>;
    getPublicTopicBySlug: (slug: string) => Promise<Topic>;
};

declare class PermissionUtils {
    static checkSupportAdminPermission: (sdk: AccelbyteSDK, accessToken?: string | undefined) => Promise<boolean>;
}

declare type FetcherProps = {
    sdk: AccelbyteSDK;
};
declare const supportPublicArticlesFetcher: ({ sdk, queryParams }: FetcherProps & {
    queryParams: {
        topicId?: string;
        limit?: string;
        offset?: string;
    };
}) => Promise<ArticleList>;
declare const supportPublicArticleBySlugFetcher: ({ sdk, queryParams }: FetcherProps & {
    queryParams: {
        slug: string;
        limit?: string;
        offset?: string;
    };
}) => Promise<Article>;
declare const supportPublicTopicsFetcher: ({ sdk, queryParams }: FetcherProps & {
    queryParams?: {
        status?: "VISIBLE" | "HIDDEN" | undefined;
        limit?: string | undefined;
        offset?: string | undefined;
    } | undefined;
}) => Promise<TopicList>;
declare const supportPublicTopicBySlugFetcher: ({ sdk, slug }: FetcherProps & {
    slug: string;
}) => Promise<Topic>;

export { Article, ArticleDetailPageProps, ArticleDetailPageWidget, ArticleDetailSkeleton, ArticleListPageWidget, ArticlesApi, ArticlesPageProps, ArticlesPageWidget, CreateArticlePageWidget, CreateTopicPageWidget, EditArticlePageWidget, EditTopicPageWidget, EditTopicPageWidgetProps, FetcherProps, ManageContentPageWidget, PermissionUtils, SupportCTAProps, SupportCTAWidget, SupportPageProps, SupportPageWidget, SupportTopicCardSkeleton, Topic, TopicListWidget, TopicsApi, supportPublicArticleBySlugFetcher, supportPublicArticlesFetcher, supportPublicTopicBySlugFetcher, supportPublicTopicsFetcher };
