interface CategoryInterface {
    id?: number;
    code: string;
    userId: number;
    accountId: number | null;
    imageId: number | null;
    categoryTypeId: number;
    parentId: number | null;
    lastUpdatedBy?: number | null;
    isRevision?: Boolean;
    adminOnly?: boolean;
    revisionId?: number;
    status: number;
    refLink: Text | null;
    orderSequence: Text;
    level: number;
    sortOrder?: number;
    categoryContent?: CategoryContentInterface,
    categoryContents?: CategoryContentInterface[];
}

interface CategoryContentInterface {
    id?: number;
    categoryId?: number;
    languageId: number;
    name: string;
    description: Text;
    descriptionText: Text;
}

interface CategoryRequestObject {
    name: string;
    description?: Text | null;
    categoryTypeCode: string;
    descriptionText?: Text | null;
    status: number | null;
    refLink: Text | null;
    imageId: number | null;
    parentId: number | null;
    seaQAApplicability?: {
        applicableRankId: number;
        applicableShipTypeId: number;
        applicableTo: string;
    } | null;
}


interface CategoryObject {
    code?: string;
    imageId: number | null;
    categoryTypeId?: number;
    parentId: number | null;
    lastUpdatedBy?: number | null;
    status?: number | null;
    refLink?: Text | null;
}

interface CategoryContentObject {
    id?: number;
    categoryId?: number;
    languageId?: number;
    name: string;
    description?: Text | null;
    descriptionText?: Text | null;
}

interface CategoryIdentifierObject {
    id: number;
}

interface CategoryTypeCodeIdentifierObject {
    categoryTypeCode: string;
}

interface CategoryStringIdentifierObject {
    code: string;
}

interface CategoryListRequestObject {
    parentId: number | null;
    page: number;
    perPage: number;
    parentId: number | null;
    searchText: string | null;
    sortBy: string;
    sortDirection: string;
    status: number | null;
}

interface CategoryListAllRequestObject {
    searchText: string | null;
    parentId: number | null;
    sortBy: string;
    sortDirection: string;
    status: number | null;
}

interface CategoryTypeObjectRefInterface {
    id: number;
    code: string;
    name: string;
}

interface ParentCategoryObjectRefInterface {
    id: number;
    code: string;
    name: string;
    parentId: number | null;
}

interface CategoryObjectInteface {
    id: number;
    code: string;
    name: string;
    description?: Text | null;
    categoryImage?: fileObject;
    categoryType: CategoryTypeObjectRefInterface;
    parentCategory?: ParentCategoryObjectRefInterface;
    parentHirarchy: ParentCategoryObjectRefInterface[];
    author: UserPublicObjectInterface | null;
    lastUpdatedBy: UserPublicObjectInterface | null,
    createdAt: Date,
    updatedAt: Date
}

interface CategoryDataObject {
    id?: number;
    code?: string;
    imageId?: number | null;
    categoryTypeId?: number;
    userId: number | null;
    accountId: number | null;
    lastUpdatedBy?: number | null;
    categoryContents?: CategoryContentObject[];
    categoryContent?: CategoryContentObject
}

interface CategoryObjectSummaryInteface {
    id: number;
    code: string;
    categoryImage?: fileObject;
    name: string;
    description?: Text | null;
    createdAt: Date,
    updatedAt: Date
}

interface CategoryPaginatedList {
    page: number;
    perPage: number;
    totalRecords: number;
    totalPages?: number;
    data: CategoryObjectSummaryInteface[] | [];
}

interface CategoryPaginatedData {
    count: number;
    rows: CategoryObjectSummaryInteface[] | []
}

interface CategoryHirarchyInterface {
    id?: number;
    name: string;
    code: string;
    parentId: number | null;
}

interface CategoryTree {
    id: number;
    code: string;
    name: string;
    categoryImage?: fileObject;
    childCategories: CategoryTree[] | [];
}

interface CategorySortRequest {
    before: number | null;
    after: number | null;
}

interface CategoryStatusObject {
    status: number;
}

interface CategorySortIdentifierObject {
    id: number;
    categoryTypeCode: string;
}

interface CategoryCreateServiceInput {
    categoryTypeCode: string;
    imageId: number | null;
    parentId: number | null;
    status: number | null;
    refLink: Text | null;
    name: string;
    description?: Text | null;
    seaQAApplicability?: {
        applicableRankId: number;
        applicableShipTypeId: number;
        applicableTo: string;
    } | null;
}


interface CategoryUpdateServiceInput {
    id: number;
    categoryTypeCode: string;
    imageId: number | null;
    parentId: number | null;
    status: number | null;
    refLink: Text | null;
    name: string;
    description?: Text | null;
    seaQAApplicability?: {
        applicableRankId: number;
        applicableShipTypeId: number;
        applicableTo: string;
    } | null;
}


interface CategoryDeleteServiceInput {
    id: number;
    categoryTypeCode: string;
}

interface CategoryGetByIdServiceInput {
    id: number;
    fullInfo?: boolean;
}

interface CategoryGetByCodeServiceInput {
    code: string;
    fullInfo?: boolean;
}

interface CategoryUpdateStatusServiceInput {
    id: number;
    status: number;
}

interface CategoryGetCategoriesServiceInput {
    categoryTypeCode: string;
    listRequest: CategoryListRequestObject;
}

interface CategoryGetAllCategoriesServiceInput {
    categoryTypeCode: string;
    listRequest: CategoryListAllRequestObject;
}

interface CategoryGetCategoryRevisionsServiceInput {
    id: number;
    listRequest: CategoryListRequestObject;
}

interface CategoryRestoreRevisionServiceInput {
    id: number;
}

interface CategoryGetCategoryTreeServiceInput {
    categoryTypeCode: string;
    code: string | null;
}

interface CategoryVerifyCategoryIdServiceInput {
    categoryId: number;
    categoryTypeCode: string;
}

interface CategoryGetCategoryIdServiceInput {
    code: string;
}

interface CategorySetSortOrderServiceInput {
    id: number;
    categoryTypeCode: string;
    before: number | null;
    after: number | null;
}

interface CategoryGetOrderSequenceDaoInput {
    id: number;
}

interface CategorySetSortOrderDaoInput {
    id: number;
    categoryTypeId: number | null;
    before?: number | null;
    after?: number | null;
    asSuperAdmin?: boolean;
}

interface CategoryGetParentHirarchyDaoInput {
    id?: number | null;
    code?: string | null;
}

interface CategoryGetFullObjectDaoInput {
    id: number;
}

interface CategoryStoreRevisionDaoInput {
    id: number;
}

interface CategoryIfChildIsParentDaoInput {
    categoryId: number;
    parentId: number;
}

interface CategoryGetDaoInput {
    id?: number | null;
    code?: string | null;
    fullInfo?: boolean;
    paranoid?: boolean;
}

interface CategoryGetByIdDaoInput {
    id: number;
    fullInfo?: boolean;
    paranoid?: boolean;
}

interface CategoryGetByCodeDaoInput {
    code: string;
    fullInfo?: boolean;
    paranoid?: boolean;
}

interface CategoryDoExistsByCodeDaoInput {
    code: string;
    excludeId?: number | null;
    includeRevision?: boolean;
}

interface CategoryDoExistsByIdDaoInput {
    id: number;
    includeRevision?: boolean;
}

interface CategoryUpdateStatusDaoInput {
    id: number;
    status: number;
}

interface CategoryCreateDaoInput {
    categoryObj: CategoryObject;
    categoryContentObj: CategoryContentObject;
    asSuperAdmin: boolean;
    languages: LanguageInfo;
}

interface CategoryUpdateDaoInput {
    id: number;
    categoryObj: CategoryObject;
    categoryContentObj: CategoryContentObject;
    languages: LanguageInfo;
}

interface CategoryDeleteDaoInput {
    id: number;
    asSuperAdmin: boolean;
}

interface CategoryGetCategoryListDaoInput {
    categoryTypeId: number | null;
    listRequest: CategoryListRequestObject;
}

interface CategoryGetAllCategoriesDaoInput {
    categoryTypeId: number | null;
    listRequest: CategoryListAllRequestObject;
}

interface CategoryGetCategoryRevisionListDaoInput {
    id: number;
    listRequest: CategoryListRequestObject;
}

interface CategoryRestoreRevisionDaoInput {
    id: number;
}

interface CategoryHasChildDaoInput {
    id: number;
}

interface CategoryGetCategoryTreeDaoInput {
    categoryTypeId: number;
    parentId: number | null;
    language: string;
}

interface CategoryGetCategoryTreeStructureDaoInput {
    categoryTypeId: number;
    parentId: number | null;
}

interface CategoryVerifyCategoryIdDaoInput {
    categoryId: number;
    categoryTypeCode: string;
}

interface CategoryGetIdFromCodeDaoInput {
    code: string;
}
