interface PlanInterface {
    id?: number;
    code: string;
    type: number;
    gateway?: string;
    trialPeriod: number;
    userId: number;
    lastUpdatedBy?: number;
    accountId?: number;
    isRevision?: Boolean;
    revisionId?: number;
    status: number;
    sortOrder?: number;
    planContent?: PlanContentInterface,
    planContents?: PlanContentInterface[];
}

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

interface PriceInterface {
    id?: number;
    planId?: number;
    amount: number;
    currency: string;
    externalPriceId?: string | null;
    duration: number;
    frequency: 'days' | 'weeks' | 'months' | 'years';
    autoRenew?: 0 | 1;
    isDefault?: boolean;
    status?: number;
}

interface PlanRequestObject {
    name: string;
    description?: Text | null;
    status: number | null;
    prices: PriceInterface[];
}

interface PlanObject {
    code: string;
    type: number;
    status: number | null;
    // prices: PriceInterface[];
}

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

interface PlanObjectInteface {
    id: number;
    code: string;
    status: number;
    name: string;
    description?: Text | null;
    descriptionText?: Text | null;
    author: UserPublicObjectInterface | null,
    lastUpdatedBy: UserPublicObjectInterface | null,
    createdAt: Date,
    updatedAt: Date
}

interface PlanObjectSummaryInteface {
    id: number;
    code: string;
    status: number;
    name: string;
    description?: Text | null;
    descriptionText?: Text | null;
    createdAt: Date,
    updatedAt: Date
}

interface PlanDataObject {
    id?: number;
    code: string;
    userId: number;
    accountId: number;
    lastUpdatedBy?: number;
    prices?: PriceInterface[];
    planContents?: PlanContentObject[];
    planContent?: PlanContentObject
}

interface PlanPaginatedList {
    page: number;
    perPage: number;
    totalRecords: number;
    totalPages?: number;
    data: PlanObjectSummaryInteface[] | [];
}

interface PlanPaginatedData {
    count: number;
    rows: PlanObjectSummaryInteface[]
}

interface PlanIdentifierObject {
    id: number;
}

interface PlanStringIdentifierObject {
    code: string;
}

interface PlanStatusObject {
    status: number;
}

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

interface PlanListAllRequestObject {
    searchText: string | null;
    sortBy: string;
    sortDirection: string;
}

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

interface DaoOptions {
    transaction?: import("sequelize").Transaction;
}

interface PlanCreateServiceInput {
    name: string;
    description?: Text | null;
    status: number | null;
    prices: PriceInterface[];
}

interface PlanUpdateServiceInput {
    id: number;
    name: string;
    description?: Text | null;
    status: number | null;
    prices: PriceInterface[];
}

interface PlanDeleteServiceInput {
    id: number;
}

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

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

interface PlanGetPlansServiceInput {
    listRequest: PlanListRequestObject;
}

interface PlanGetAllPlansServiceInput {
    listRequest: PlanListAllRequestObject;
}

interface PlanGetPlansRevisionsServiceInput {
    id: number;
    listRequest: PlanListRequestObject;
    language?: string | null;
}

interface PlanRestoreRevisionServiceInput {
    id: number;
}

interface PlanGetPlanIdServiceInput {
    code: string;
}

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

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

interface PlanCreatePriceServiceInput {
    amount: number;
    duration: number;
    frequency: 'days' | 'weeks' | 'months' | 'years';
    autoRenew?: 0 | 1;
    currency: string;
    planId: number;
}

interface PlanUpdatePriceStatusServiceInput {
    id: number;
    planId: number;
    status: number;
}

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

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

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

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

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

interface PlanCreateDaoInput {
    planObj: PlanObject;
    planContentObj: PlanContentObject;
    prices: PriceInterface[];
    languages: LanguageInfo;
}

interface PlanUpdateDaoInput {
    id: number;
    planObj: PlanObject;
    planContentObj: PlanContentObject;
    prices: PriceInterface[];
    languages: LanguageInfo;
}

interface PlanDeleteDaoInput {
    id: number;
}

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

interface PlanGetPlanListDaoInput {
    listRequest: PlanListRequestObject;
}

interface PlanGetAllPlansDaoInput {
    listRequest: PlanListAllRequestObject;
}

interface PlanGetPlanRevisionListDaoInput {
    id: number;
    listRequest: PlanListRequestObject;
    language?: string | null;
}

interface PlanRestoreRevisionDaoInput {
    id: number;
}

interface PlanGetIdFromCodeDaoInput {
    code: string;
}

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

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

interface PlanGetExternalPriceByIdDaoInput {
    id: number;
}

interface PlanGetPriceByIdDaoInput {
    id: number;
}

interface PlanCreatePriceDaoInput {
    price: PriceInterface;
}
