import IDictionary from "../utils/IDictionary";
export interface ISwrveCampaignResourceResponse
{
    real_time_user_properties?: IDictionary<string>;
    user_resources?: ReadonlyArray<IUserResource>;
    location_campaigns?: object;
    campaigns: ISwrveCampaigns;
    qa?: {reset_device_state: boolean, logging: boolean, logging_url?: string, campaigns?: ReadonlyArray<ISwrveCampaign>};
    flush_frequency: number;
    flush_refresh_delay: number;
}

export interface IUserResource {
    [key: string]: string;
}

export interface IQAUser
{
    reset_device_state: boolean;
    logging: boolean;
    logging_url?: string;
    campaigns?: ReadonlyArray<ISwrveCampaign>;
}

export interface ISwrveCampaigns
{
    game_data: object;
    campaigns: ReadonlyArray<ISwrveCampaign>;
    rules: ISwrveGlobalRule;
    cdn_root?: string;
    cdn_paths?: {message_images: string, message_fonts: string};
    version: number;
}

export interface ISwrveCampaign
{
    id: number;
    start_date: number;
    end_date: number;
    rules: ISwrveCampaignRule;
    triggers?: ReadonlyArray<ISwrveTrigger>;
    message_center: boolean;
    embedded_message?: ISwrveEmbeddedMessage;
    messages?: ReadonlyArray<ISwrveMessage>;
    subject: string | null;
}

export interface ISwrveTrigger{
    event_name: string;
    conditions?: ISwrveCondition;
    parentCampaign?: number;
}

export interface ISwrveConditionEq {
    op: "eq";
    key: string;
    value: string;
}

export interface ISwrveConditionContains {
    op: "contains";
    key: string;
    value: string;
}

export interface ISwrveConditionAnd {
    op: "and";
    args: ReadonlyArray<ISwrveCondition>;
}

export interface ISwrveConditionOr {
    op: "or";
    args: ReadonlyArray<ISwrveCondition>;
}

export interface ISwrveConditionEmpty {
    op?: undefined;
}

export type ISwrveCondition = ISwrveConditionEq | ISwrveConditionContains | ISwrveConditionAnd | ISwrveConditionOr | ISwrveConditionEmpty;

export interface ISwrveCampaignRule
{
    delay_first_message: number;
    dismiss_after_views: number;
    display_order: string;
    min_delay_between_messages: number;
}

export interface ISwrveGlobalRule
{
    delay_first_message?: number;
    min_delay_between_messages?: number;
    max_messages_per_session?: number;
}

export interface ISwrveBaseMessage {
    id: number;
    name: string;
    priority: number;
    rules: { orientations: string };
    parentCampaign?: number;
}

export interface ISwrveEmbeddedMessage extends ISwrveBaseMessage {
    data: string;
    buttons: ReadonlyArray<string>;
    type: "other" | "json";
}

export interface ISwrveMessage extends ISwrveBaseMessage {
    template: { formats: ReadonlyArray<ISwrveFormat> };
}

export interface ISwrveFormat
{
    name: string;
    orientation: string;
    language: string;
    size: ISwrveSize;
    images: ReadonlyArray<ISwrveImage>;
    buttons: ReadonlyArray<ISwrveButton>;
    scaled_by: number;
    scaled_from: string;
    scale: number;
    color?: string;
    pages?: Array<{
        page_id: number;
        page_name: string;
        swipe_backward: number;
        swipe_forward: number;
        images: ReadonlyArray<ISwrveImage>;
        buttons: ReadonlyArray<ISwrveButton>;
    }>;
}

export interface ISwrveSize
{
    w: ISwrveValue;
    h: ISwrveValue;
}

export interface ISwrveValue
{
    type: string;
    value: number|string;
}

export interface ISwrveAsset {
    getAssetID(): string|number;
    getAssetPath(): string | number;
    canRender(): boolean;
}

export interface ISwrveButton
{
    name: string;
    x: ISwrveValue;
    y: ISwrveValue;
    w: ISwrveValue;
    h: ISwrveValue;
    image_width: number;
    image_height: number;
    image_filename: string;
    type: ISwrveValue;
    action: ISwrveValue;
    game_id: ISwrveValue;
    image_up: ISwrveValue;
    dynamic_image_url?: string;
    text?: ISwrveValue;
    button_id?: number;
    events?: ReadonlyArray<IButtonCaptureEvent>;
    user_updates?: ReadonlyArray<IButtonCaptureUserEvent>;
    accessibility_text?: string;
}

export interface IButtonCaptureEvent
{
    name: string;
    payload?: ReadonlyArray<IPayloadItem>;
}

export interface IPayloadItem
{
    key: string;
    value: string | number;
}

export interface IButtonCaptureUserEvent
{
    key: string;
    value: string | number | boolean;
}

export interface ISwrveImage
{
    color: ISwrveValue;
    image: ISwrveValue;
    image_filename: string;
    image_height: number;
    image_width: number;
    name: string;
    w: ISwrveValue;
    x: ISwrveValue;
    y: ISwrveValue;
    h: ISwrveValue;
    dynamic_image_url?: string;
    text?: ISwrveValue;
    accessibility_text?: string;
}
