"use strict";

//  These events are not guaranteed to be perfectly
//  representative of what the server sends.  We
//  have a tool called check-schemas that tries
//  to validate this data against server side schemas,
//  but there are certain edge cases that the tool now
//  skips.  And even when the data matches the schema,
//  it may not be completely representative.

const test_user = {
    email: "test@example.com",
    user_id: 101,
    full_name: "Test User",
};
exports.test_user = test_user;

exports.test_message = {
    sender_id: test_user.user_id,
    id: 99,
};

const typing_person1 = {
    user_id: 1,
    email: "user1@example.com",
};

const typing_person2 = {
    user_id: 2,
    email: "user2@example.com",
};

exports.typing_person1 = typing_person1;
exports.typing_person2 = typing_person2;

const fake_then = 1596710000;
const fake_now = 1596713966;

exports.test_streams = {
    devel: {
        name: "devel",
        description: ":devel fun:",
        rendered_description: "<b>devel fun</b>",
        invite_only: false,
        stream_id: 101,
        date_created: fake_now,
        first_message_id: 1,
        history_public_to_subscribers: false,
        is_announcement_only: false,
        is_web_public: false,
        message_retention_days: null,
        stream_post_policy: 1,
    },
    test: {
        name: "test",
        description: "test desc",
        rendered_description: "test desc",
        invite_only: true,
        stream_id: 102,
        date_created: fake_then,
        first_message_id: 1,
        history_public_to_subscribers: false,
        is_web_public: false,
        is_announcement_only: false,
        message_retention_days: null,
        stream_post_policy: 1,
    },
};

const streams = exports.test_streams;

// TODO: we want to validate this better with check-schema.
// The data should mostly be representative here, but we don't
// really exercise it in our tests yet.
const message_detail = {
    type: "stream",
    mentioned: false,
    sender_id: test_user.id,
    stream_id: streams.devel.test_id,
};

exports.test_realm_emojis = {
    101: {
        id: "101",
        name: "spain",
        source_url: "/some/path/to/spain.gif",
        still_url: "/some/path/to/spain.png",
        deactivated: false,
        author_id: test_user.user_id,
    },
    102: {
        id: "102",
        name: "green_tick",
        author_id: 222,
        deactivated: false,
        source_url: "/some/path/to/emoji",
        still_url: null,
    },
};

exports.fixtures = {
    alert_words: {
        type: "alert_words",
        alert_words: ["fire", "lunch"],
    },

    attachment__add: {
        type: "attachment",
        op: "add",
        attachment: {
            id: 99,
            name: "foo.png",
            size: 4096,
            path_id: "path_id",
            create_time: fake_now,
            messages: [
                {
                    id: 1000,
                    date_sent: fake_now,
                },
            ],
        },
        upload_space_used: 90000,
    },

    custom_profile_fields: {
        type: "custom_profile_fields",
        fields: [
            {id: 1, name: "teams", type: 1, hint: "", field_data: "", order: 1},
            {id: 2, name: "hobbies", type: 1, hint: "", field_data: "", order: 2},
        ],
    },

    default_streams: {
        type: "default_streams",
        default_streams: [streams.devel, streams.test],
    },

    delete_message: {
        type: "delete_message",
        message_ids: [1337],
        message_type: "stream",
        stream_id: 99,
        topic: "topic1",
    },

    has_zoom_token: {
        type: "has_zoom_token",
        value: true,
    },

    hotspots: {
        type: "hotspots",
        hotspots: [
            {
                name: "topics",
                title: "About topics",
                description: "Topics are good.",
                delay: 1.5,
            },
            {
                name: "compose",
                title: "Compose box",
                description: "This is where you compose messages.",
                delay: 3.14159,
            },
        ],
    },

    invites_changed: {
        type: "invites_changed",
    },

    muted_topics: {
        type: "muted_topics",
        muted_topics: [
            ["devel", "js", fake_then],
            ["lunch", "burritos", fake_now],
        ],
    },

    muted_users: {
        type: "muted_users",
        muted_users: [
            {
                id: 5,
                timestamp: fake_then,
            },
            {
                id: 23,
                timestamp: fake_now,
            },
        ],
    },

    presence: {
        type: "presence",
        email: "alice@example.com",
        user_id: 42,
        presence: {
            electron: {
                status: "active",
                timestamp: fake_now,
                client: "electron",
                pushable: false,
            },
        },
        server_timestamp: fake_now,
    },

    reaction__add: {
        type: "reaction",
        op: "add",
        message_id: 128,
        reaction_type: "unicode_emoji",
        emoji_name: "airplane",
        emoji_code: "2708",
        user_id: test_user.user_id,
        user: {
            email: test_user.email,
            full_name: test_user.full_name,
            user_id: test_user.user_id,
        },
    },

    reaction__remove: {
        type: "reaction",
        op: "remove",
        message_id: 256,
        reaction_type: "unicode_emoji",
        emoji_name: "8ball",
        emoji_code: "1f3b1",
        user_id: test_user.user_id,
        user: {
            email: test_user.email,
            full_name: test_user.full_name,
            user_id: test_user.user_id,
        },
    },

    realm__deactivated: {
        type: "realm",
        op: "deactivated",
        realm_id: 2,
    },

    realm__update__bot_creation_policy: {
        type: "realm",
        op: "update",
        property: "bot_creation_policy",
        value: 1,
    },

    realm__update__create_private_stream_policy: {
        type: "realm",
        op: "update",
        property: "create_private_stream_policy",
        value: 2,
    },

    realm__update__create_public_stream_policy: {
        type: "realm",
        op: "update",
        property: "create_public_stream_policy",
        value: 2,
    },

    realm__update__create_web_public_stream_policy: {
        type: "realm",
        op: "update",
        property: "create_web_public_stream_policy",
        value: 2,
    },

    realm__update__default_code_block_language: {
        type: "realm",
        op: "update",
        property: "default_code_block_language",
        value: "javascript",
    },

    realm__update__disallow_disposable_email_addresses: {
        type: "realm",
        op: "update",
        property: "disallow_disposable_email_addresses",
        value: false,
    },

    realm__update__email_addresses_visibility: {
        type: "realm",
        op: "update",
        property: "email_address_visibility",
        value: 3,
    },

    realm__update__emails_restricted_to_domains: {
        type: "realm",
        op: "update",
        property: "emails_restricted_to_domains",
        value: false,
    },

    realm__update__enable_spectator_access: {
        type: "realm",
        op: "update",
        property: "enable_spectator_access",
        value: true,
    },

    realm__update__invite_required: {
        type: "realm",
        op: "update",
        property: "invite_required",
        value: false,
    },

    realm__update__invite_to_realm_policy: {
        type: "realm",
        op: "update",
        property: "invite_to_realm_policy",
        value: 2,
    },

    realm__update__invite_to_stream_policy: {
        type: "realm",
        op: "update",
        property: "invite_to_stream_policy",
        value: 2,
    },

    realm__update__name: {
        type: "realm",
        op: "update",
        property: "name",
        value: "new_realm_name",
    },

    realm__update__notifications_stream_id: {
        type: "realm",
        op: "update",
        property: "notifications_stream_id",
        value: 42,
    },

    realm__update__org_type: {
        type: "realm",
        op: "update",
        property: "org_type",
        value: 50,
    },

    realm__update__signup_notifications_stream_id: {
        type: "realm",
        op: "update",
        property: "signup_notifications_stream_id",
        value: 41,
    },

    realm__update__want_advertise_in_communities_directory: {
        type: "realm",
        op: "update",
        property: "want_advertise_in_communities_directory",
        value: false,
    },

    realm__update_dict__default: {
        type: "realm",
        op: "update_dict",
        property: "default",
        data: {
            allow_message_editing: true,
            message_content_edit_limit_seconds: 5,
            authentication_methods: {
                Google: true,
            },
        },
    },

    realm__update_dict__icon: {
        type: "realm",
        op: "update_dict",
        property: "icon",
        data: {
            icon_url: "icon.png",
            icon_source: "U",
        },
    },

    realm__update_dict__logo: {
        type: "realm",
        op: "update_dict",
        property: "logo",
        data: {
            logo_url: "logo.png",
            logo_source: "U",
        },
    },

    realm__update_dict__night_logo: {
        type: "realm",
        op: "update_dict",
        property: "night_logo",
        data: {
            night_logo_url: "night_logo.png",
            night_logo_source: "U",
        },
    },

    realm_bot__add: {
        type: "realm_bot",
        op: "add",
        bot: {
            email: "the-bot@example.com",
            user_id: 42,
            avatar_url: "/some/path/to/avatar",
            api_key: "SOME_KEY",
            full_name: "The Bot",
            bot_type: 1,
            default_all_public_streams: true,
            default_events_register_stream: "whatever",
            default_sending_stream: "whatever",
            is_active: true,
            owner_id: test_user.user_id,
            services: [],
        },
    },

    realm_bot__delete: {
        type: "realm_bot",
        op: "delete",
        bot: {
            user_id: 42,
        },
    },

    realm_bot__remove: {
        type: "realm_bot",
        op: "remove",
        bot: {
            user_id: 42,
            full_name: "The Bot",
        },
    },

    realm_bot__update: {
        type: "realm_bot",
        op: "update",
        bot: {
            user_id: 4321,
            full_name: "The Bot Has A New Name",
        },
    },

    realm_domains__add: {
        type: "realm_domains",
        op: "add",
        realm_domain: {
            domain: "ramen",
            allow_subdomains: false,
        },
    },

    realm_domains__change: {
        type: "realm_domains",
        op: "change",
        realm_domain: {
            domain: "ramen",
            allow_subdomains: true,
        },
    },

    realm_domains__remove: {
        type: "realm_domains",
        op: "remove",
        domain: "ramen",
    },

    realm_emoji__update: {
        type: "realm_emoji",
        op: "update",
        realm_emoji: exports.test_realm_emojis,
    },

    realm_export: {
        type: "realm_export",
        exports: [
            {
                id: 55,
                export_time: fake_now,
                acting_user_id: test_user.user_id,
                export_url: "/some/path/to/export",
                deleted_timestamp: null,
                failed_timestamp: null,
                pending: true,
            },
        ],
    },

    realm_linkifiers: {
        type: "realm_linkifiers",
        realm_linkifiers: [
            {
                pattern: "#[123]",
                url_format: "ticket %(id)s",
                id: 55,
            },
        ],
    },

    realm_playgrounds: {
        type: "realm_playgrounds",
        realm_playgrounds: [
            {
                id: 1,
                name: "Lean playground",
                pygments_language: "Lean",
                url_prefix: "https://leanprover.github.io/live/latest/#code=",
            },
        ],
    },

    realm_user__add: {
        type: "realm_user",
        op: "add",
        person: {
            ...test_user,
            avatar_url: "/some/path/to/avatar",
            avatar_version: 1,
            is_admin: false,
            is_active: true,
            is_owner: false,
            is_billing_admin: false,
            role: 400,
            is_bot: false,
            is_guest: false,
            profile_data: {},
            timezone: "America/New_York",
            date_joined: "2020-01-01",
        },
    },

    realm_user__remove: {
        type: "realm_user",
        op: "remove",
        person: {
            full_name: test_user.full_name,
            user_id: test_user.user_id,
        },
    },

    realm_user__update: {
        type: "realm_user",
        op: "update",
        person: {
            user_id: test_user.user_id,
            full_name: "Bob NewName",
        },
    },

    realm_user_settings_defaults__emojiset: {
        type: "realm_user_settings_defaults",
        op: "update",
        property: "emojiset",
        value: "google",
    },

    realm_user_settings_defaults__notification_sound: {
        type: "realm_user_settings_defaults",
        op: "update",
        property: "notification_sound",
        value: "ding",
    },

    realm_user_settings_defaults__presence_enabled: {
        type: "realm_user_settings_defaults",
        op: "update",
        property: "presence_enabled",
        value: false,
    },

    restart: {
        type: "restart",
        zulip_version: "4.0-dev+git",
        zulip_merge_base: "",
        zulip_feature_level: 55,
        server_generation: 2,
        immediate: true,
    },

    stream__create: {
        type: "stream",
        op: "create",
        streams: [streams.devel, streams.test],
    },

    stream__delete: {
        type: "stream",
        op: "delete",
        streams: [streams.devel, streams.test],
    },

    stream__update: {
        type: "stream",
        op: "update",
        name: "devel",
        stream_id: 99,
        property: "color",
        value: "blue",
    },

    submessage: {
        type: "submessage",
        submessage_id: 99,
        sender_id: 42,
        msg_type: "stream",
        message_id: 56,
        content: "test",
    },

    subscription__add: {
        type: "subscription",
        op: "add",
        subscriptions: [
            {
                ...streams.devel,
                audible_notifications: true,
                color: "blue",
                desktop_notifications: false,
                email_address: "whatever",
                email_notifications: false,
                in_home_view: false,
                is_muted: true,
                pin_to_top: false,
                push_notifications: false,
                stream_weekly_traffic: 40,
                wildcard_mentions_notify: false,
                role: 20,
                subscribers: [5, 8, 13, 21],
            },
        ],
    },

    subscription__peer_add: {
        type: "subscription",
        op: "peer_add",
        user_ids: [test_user.user_id],
        stream_ids: [streams.devel.stream_id],
    },

    subscription__peer_remove: {
        type: "subscription",
        op: "peer_remove",
        user_ids: [test_user.user_id],
        stream_ids: [streams.devel.stream_id],
    },

    subscription__remove: {
        type: "subscription",
        op: "remove",
        subscriptions: [
            {
                name: "devel",
                stream_id: 42,
            },
        ],
    },

    subscription__update: {
        type: "subscription",
        op: "update",
        stream_id: streams.devel.stream_id,
        property: "pin_to_top",
        value: true,
    },

    typing__start: {
        type: "typing",
        op: "start",
        message_type: "private",
        sender: typing_person1,
        recipients: [typing_person2],
    },

    typing__stop: {
        type: "typing",
        op: "stop",
        message_type: "private",
        sender: typing_person1,
        recipients: [typing_person2],
    },

    update_message_flags__read: {
        type: "update_message_flags",
        op: "add",
        operation: "add",
        flag: "read",
        messages: [999],
        all: false,
    },

    update_message_flags__read_remove: {
        type: "update_message_flags",
        op: "remove",
        operation: "remove",
        flag: "read",
        messages: [888],
        message_details: {888: message_detail},
        all: false,
    },

    update_message_flags__starred_add: {
        type: "update_message_flags",
        op: "add",
        operation: "add",
        flag: "starred",
        messages: [exports.test_message.id],
        all: false,
    },

    update_message_flags__starred_remove: {
        type: "update_message_flags",
        op: "remove",
        operation: "remove",
        flag: "starred",
        messages: [exports.test_message.id],
        all: false,
    },

    user_group__add: {
        type: "user_group",
        op: "add",
        group: {
            id: 555,
            name: "Mobile",
            description: "mobile folks",
            members: [1],
            is_system_group: false,
            direct_subgroup_ids: [2],
        },
    },

    user_group__add_members: {
        type: "user_group",
        op: "add_members",
        group_id: 1,
        user_ids: [2],
    },

    user_group__add_subgroups: {
        type: "user_group",
        op: "add_subgroups",
        group_id: 1,
        direct_subgroup_ids: [3],
    },

    user_group__remove: {
        type: "user_group",
        op: "remove",
        group_id: 1,
    },

    user_group__remove_members: {
        type: "user_group",
        op: "remove_members",
        group_id: 3,
        user_ids: [99, 100],
    },

    user_group__remove_subgroups: {
        type: "user_group",
        op: "remove_subgroups",
        group_id: 1,
        direct_subgroup_ids: [3],
    },

    user_group__update: {
        type: "user_group",
        op: "update",
        group_id: 3,
        data: {
            name: "Frontend",
            description: "All Frontend people",
        },
    },

    user_settings__color_scheme_automatic: {
        type: "user_settings",
        op: "update",
        property: "color_scheme",
        value: 1,
    },

    user_settings__color_scheme_dark: {
        type: "user_settings",
        op: "update",
        property: "color_scheme",
        value: 2,
    },

    user_settings__color_scheme_light: {
        type: "user_settings",
        op: "update",
        property: "color_scheme",
        value: 3,
    },

    user_settings__default_language: {
        type: "user_settings",
        op: "update",
        property: "default_language",
        value: "fr",
        language_name: "French",
    },

    user_settings__default_view_all_messages: {
        type: "user_settings",
        op: "update",
        property: "default_view",
        value: "all_messages",
    },

    user_settings__default_view_recent_topics: {
        type: "user_settings",
        op: "update",
        property: "default_view",
        value: "recent_topics",
    },

    user_settings__demote_inactive_streams: {
        type: "user_settings",
        op: "update",
        property: "demote_inactive_streams",
        value: 2,
    },

    user_settings__dense_mode: {
        type: "user_settings",
        op: "update",
        property: "dense_mode",
        value: true,
    },

    user_settings__display_emoji_reaction_users: {
        type: "user_settings",
        op: "update",
        property: "display_emoji_reaction_users",
        value: true,
    },

    user_settings__emojiset: {
        type: "user_settings",
        op: "update",
        property: "emojiset",
        value: "google",
    },

    user_settings__enable_stream_audible_notifications: {
        type: "user_settings",
        op: "update",
        property: "enable_stream_audible_notifications",
        value: true,
    },

    user_settings__enter_sends: {
        type: "user_settings",
        op: "update",
        property: "enter_sends",
        value: true,
    },

    user_settings__escape_navigates_to_default_view: {
        type: "user_settings",
        op: "update",
        property: "escape_navigates_to_default_view",
        value: true,
    },

    user_settings__fluid_layout_width: {
        type: "user_settings",
        op: "update",
        property: "fluid_layout_width",
        value: true,
    },

    user_settings__high_contrast_mode: {
        type: "user_settings",
        op: "update",
        property: "high_contrast_mode",
        value: true,
    },

    user_settings__left_side_userlist: {
        type: "user_settings",
        op: "update",
        property: "left_side_userlist",
        value: true,
    },

    user_settings__presence_enabled: {
        type: "user_settings",
        op: "update",
        property: "presence_enabled",
        value: false,
    },

    user_settings__starred_message_counts: {
        type: "user_settings",
        op: "update",
        property: "starred_message_counts",
        value: true,
    },

    user_settings__translate_emoticons: {
        type: "user_settings",
        op: "update",
        property: "translate_emoticons",
        value: true,
    },

    user_settings__twenty_four_hour_time: {
        type: "user_settings",
        op: "update",
        property: "twenty_four_hour_time",
        value: true,
    },

    user_status__revoke_away: {
        type: "user_status",
        user_id: 63,
        away: false,
    },

    user_status__set_away: {
        type: "user_status",
        user_id: 55,
        away: true,
    },

    user_status__set_status_emoji: {
        type: "user_status",
        user_id: test_user.user_id,
        emoji_name: "smiley",
        emoji_code: "1f603",
        reaction_type: "unicode_emoji",
    },

    user_status__set_status_text: {
        type: "user_status",
        user_id: test_user.user_id,
        status_text: "out to lunch",
    },
};
