interface SettingInterface {
    id?: number;
    code: string;
    userId: number;
    accountId: number | null;
    categoryId: number;
    lastUpdatedBy?: number;
    isRevision?: Boolean;
    revisionId?: number;
    status: number;
    sortOrder?: number;
    valueType: string;
    settingContent?: SettingContentInterface,
    settingContents?: SettingContentInterface[];
}

interface SettingContentInterface {
    id?: number;
    settingId?: number;
    languageId: number;
    label: string;
    valueString: string;
    valueText: Text;
    valueBoolean: boolean;
    valueNumeric: number;
}

interface SettingRequestObject {
    label: string;
    code: string;
    categoryCode: string | null;
    valueType: string;
    value: string | Text | number | boolean,
    status: number | null;
}

interface SettingObject {
    code: string;
    categoryId: number | null;
    status: number | null;
}

interface SettingContentObject {
    id?: number;
    settingId?: number;
    languageId?: number;
    label: string;
    valueString: string | null;
    valueText: Text | null;
    valueBoolean: boolean | null;
    valueNumeric: number | null;
}

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

interface SettingObjectInteface {
    id: number;
    code: string;
    status: number;
    label: string;
    value: string | Text | number | boolean
    author: UserPublicObjectInterface | null,
    lastUpdatedBy: UserPublicObjectInterface | null,
    settingCategory: SettingCategoryObjectRefInterface;
    createdAt: Date,
    updatedAt: Date
}

interface SettingObjectSummaryInteface {
    id: number;
    code: string;
    status: number;
    label: string;
    valueType: string;
    value: string | Text | number | boolean
    descriptionText?: Text | null;
    createdAt: Date,
    updatedAt: Date
}

interface SettingDataObject {
    id?: number;
    code?: string;
    userId: number | null;
    accountId: number | null;
    lastUpdatedBy?: number | null;
    settingContent?: SettingContentObject,
    settingContents?: SettingContentObject[];
}

interface SettingPaginatedList {
    page: number;
    perPage: number;
    totalRecords: number;
    totalPages?: number;
    data: SettingObjectSummaryInteface[] | [];
}

interface SettingPaginatedData {
    count: number;
    rows: SettingObjectSummaryInteface[]
}

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

interface SettingIdentifierObject {
    id: number;
}

interface SettingTree {
    id: number;
    code: string;
    name: string;
    categorySettings: SettingSummaryObjectInteface[];
    childCategories?: SettingTree[] | [];
}

interface SettingCategoryCodeIdentifierObject {
    categoryCode: string;
}

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

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

interface SettingStatusObject {
    status: number;
}

interface SettingUpdateObject {
    code: string;
    value: string;
}

interface SettingUpdateMultipleRequest {
    categoryCode: string;
    settings: SettingUpdateObject[];
}

interface SettingUpdateValueObject {
    settingId: number;
    valueString: string | null;
    valueText: Text | null;
    valueBoolean: boolean | null;
    valueNumeric: number | null;
}

interface SettingData {
    code: string;
    value: string | number | boolean | Text
}

interface SettingCreateServiceInput {
    categoryCode: string | null;
    code: string;
    label: string;
    valueType: string;
    value: string | Text | number | boolean;
    status: number | null;
}

interface SettingUpdateServiceInput {
    id: number;
    categoryCode: string | null;
    code: string;
    label: string;
    valueType: string;
    value: string | Text | number | boolean;
    status: number | null;
}

interface SettingDeleteServiceInput {
    id: number;
}

interface SettingGetByIdServiceInput {
    id: number;
    expanded?: boolean;
}

interface SettingGetByCodeServiceInput {
    code: string;
    expanded?: boolean;
}

interface SettingGetSettingsServiceInput {
    categoryCode: string;
    listRequest: SettingListRequestObject;
}

interface SettingGetAllSettingsServiceInput {
    categoryCode: string;
    listRequest: SettingListAllRequestObject;
}

interface SettingGetSettingsRevisionsServiceInput {
    id: number;
    listRequest: SettingListRequestObject;
}

interface SettingRestoreRevisionServiceInput {
    id: number;
}

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

interface SettingSetSortOrderServiceInput {
    id: number;
    before: number | null;
    after: number | null;
}

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

interface SettingUpdateCategorySettingsServiceInput {
    categoryCode: string;
    settings: SettingUpdateObject[];
}

interface SettingGetCategoryIdServiceInput {
    categoryCode: string;
}

interface SettingGetSettingIdServiceInput {
    code: string;
}

interface SettingGetFullObjectDaoInput {
    id: number;
}

interface SettingSetSortOrderDaoInput {
    id: number;
    before?: number | null;
    after?: number | null;
}

interface SettingStoreRevisionDaoInput {
    id: number;
}

interface SettingGetDaoInput {
    id?: number | null;
    code?: string | null;
    expanded?: boolean;
    paranoid?: boolean;
}

interface SettingGetByIdDaoInput {
    id: number;
    expanded?: boolean;
    paranoid?: boolean;
}

interface SettingGetByCodeDaoInput {
    code: string;
    expanded?: boolean;
    paranoid?: boolean;
}

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

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

interface SettingCreateDaoInput {
    settingObj: SettingObject;
    settingContentObj: SettingContentObject;
    languages: LanguageInfo;
}

interface SettingUpdateDaoInput {
    id: number;
    settingObj: SettingObject;
    settingContentObj: SettingContentObject;
    languages: LanguageInfo;
}

interface SettingDeleteDaoInput {
    id: number;
}

interface SettingGetListDaoInput {
    categoryId: number;
    listRequest: SettingListRequestObject;
}

interface SettingGetAllListDaoInput {
    categoryId: number;
    listRequest: SettingListAllRequestObject;
}

interface SettingGetRevisionListDaoInput {
    id: number;
    listRequest: SettingListRequestObject;
}

interface SettingRestoreRevisionDaoInput {
    id: number;
}

interface SettingGetIdFromCodeDaoInput {
    code: string;
}

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

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

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

interface SettingUpdateSettingValueDaoInput {
    updatedSetting: SettingUpdateValueObject[];
    languages: LanguageInfo;
}

interface SettingGetAccountSettingsDaoInput {
    accountId: number | null;
}
