import { Account as Acc } from "lincd-ads/lib/shapes/Account";
import { Ad } from "lincd-ads/lib/shapes/Ad";
import { AdSet } from "lincd-ads/lib/shapes/AdSet";
import { Campaign } from "lincd-ads/lib/shapes/Campaign";

type attributionWindows = "CLICK_28_DAY" | "VIEW_1_DAY";

type conversionTypes =
    | "Generic"
    | "AppInstall"
    | "Purchase"
    | "GenerateLead"
    | "CompleteRegistration"
    | "AddPaymentInfo"
    | "AddToCart"
    | "AddToWishlist"
    | "InitiateCheckout"
    | "Search";

export type field =
    | "accountId"
    | "accountName"
    | "accountCurrency"
    | "adId"
    | "adName"
    | "adSetId"
    | "adSetName"
    | "bidAmount"
    | "campaignId"
    | "campaignName"
    | "clicks"
    | "conversions"
    | "conversionRate"
    | "cpc"
    | "ctr"
    | "dailyBudget"
    | "impressions"
    | "lifetimeBudget"
    | "landingURL"
    | "spend"
    | "status"
    | "leadsGenerated"
    | "formCompletionRate"
    | "costPerLead";
type granularity = "DAY" | "TOTAL";
export type level = "AD" | "AD_SET" | "CAMPAIGN" | "ACCOUNT";
type order = "ASCENDING" | "DESCENDING";
type presetTimeRange =
    | "LAST_30_DAYS"
    | "TODAY"
    | "YESTERDAY"
    | "THIS_MONTH"
    | "LAST_MONTH"
    | "LAST_7_DAYS"
    | "LAST_14_DAYS"
    | "ALL_TIME";
type statusResponse = "RUNNING";

export interface QuoraOptions {
    attributionWindows?: attributionWindows[];
    conversionTypes?: conversionTypes[];
    endDate?: Date;
    fields?: field[];
    granularity?: granularity;
    level?: level;
    limit?: number;
    offset?: number;
    order?: order;
    presetTimeRange?: presetTimeRange;
    sort?: field;
    sortConversionType?: conversionTypes;
    startDate?: Date;
    summary?: boolean;
}

interface ConversionsResponse {
    Generic?: number;
    AppInstall?: number;
    Purchase?: number;
    GenerateLead?: number;
    CompleteRegistration?: number;
    AddPaymentInfo?: number;
    AddToCart?: number;
    AddToWishlist?: number;
    InitiateCheckout?: number;
    Search?: number;
}

interface ConversionRateResponse {
    Generic?: number;
    AppInstall?: number;
    Purchase?: number;
    GenerateLead?: number;
    CompleteRegistration?: number;
    AddPaymentInfo?: number;
    AddToCart?: number;
    AddToWishlist?: number;
    InitiateCheckout?: number;
    Search?: number;
}

interface Account {
    accountId?: number;
    accountName?: string;
}

export interface AccountResponse {
    data?: Account[];
}

export interface DataResponse {
    clicks?: number;
    conversions?: ConversionsResponse;
    conversionRate?: ConversionRateResponse;
    cpc?: number;
    ctr?: number;
    impressions?: number;
    spend?: number;
    leadsGenerated?: number;
    formCompletionRate?: number;
    costPerLead?: number;
    startDate?: string;
    endDate?: string;
    accountId?: number;
    accountName?: string;
    accountCurrency?: string;
    adId?: number;
    adName?: string;
    adSetId?: number;
    adSetName?: string;
    bidAmount?: number;
    campaignId?: number;
    campaignName?: string;
    dailyBudget?: number;
    lifetimeBudget?: number;
    landingURL?: string;
    status?: statusResponse;
}

export interface PublicDataResponse {
    id?: string;
    publicName?: string;
}

export interface Paging {
    totalResults: number;
    next?: string;
    previous?: string;
}

export type ResolvedQuoraResponse<T = DataResponse[]> = {
    data: T;
    endDate: string;
    startDate: string;
    paging?: Paging;
};

type QuoraJSON<T> = Promise<ResolvedQuoraResponse<T>>;

export interface QuoraResponse<T = DataResponse[]> extends Response {
    json(): QuoraJSON<T>;
}

export type QuoraAPICall = (
    id: number,
    options?: QuoraOptions
) => Promise<QuoraResponse>;

export type ResponseMapping = (string | number | [])[];

export interface AccountData {
    account: Acc;
    ads: Ad[];
    adSets: AdSet[];
    campaigns: Campaign[];
}
