﻿using System;
using System.Collections.Generic;
using System.Reflection;

namespace AsmodeeDigital.PlayReal.Plugin.Domain
{
    public static class AsyncMessageHelper
    {
        private static readonly Dictionary<int, string> RequestMapByTag;

        static AsyncMessageHelper()
        {
            RequestMapByTag = new Dictionary<int, string>() {
                { 100, "auth_request" },
                { 101, "table_request" },
                { 103, "disconnect_request" },
                { 104, "table_list_request" },
                { 105, "chat_request" },
                { 106, "lurk_request" },
                { 107, "player_info_request" },
                { 108, "find_info_request" },
                { 109, "start_game_request" },
                { 110, "compressed_table_list_request" },
                { 111, "buddy_list_request" },
                { 200, "your_turn_request" },
                { 201, "ok_request" },
                { 202, "end_match_request" },
                { 203, "new_player_request" },
                { 204, "error_request" },
                { 205, "leave_game_request" },
                { 206, "change_visibility_request" },
                { 207, "initiate_invitation_request" },
                { 208, "invitation_request" },
                { 209, "invitation_cancelled_request" },
                { 210, "invitation_denied_request" },
                { 211, "invitation_accepted_request" },
                { 212, "rematch_accept_request" },
                { 213, "rematch_accepted_request" },
                { 214, "rematch_invitation_request" },
                { 215, "user_agent_request" },
                { 216, "lobby_content_request" },
                { 217, "hotswap_table_request" },
                { 218, "kick_request" },
                { 219, "refrech_rights_request" },
                { 220, "player_info_changed_request" },
                { 400, "async_auth_request" },
                { 401, "async_disconnect_request" },
                { 402, "engage_game_request" },
                { 403, "game_engaged_request" },
                { 404, "game_created_request" },
                { 405, "engage_game_with_friends_request" },
                { 406, "async_connected_request" },
                { 407, "async_connection_error_request" },
                { 408, "ask_server_statistics_request" },
                { 409, "server_statistics_request" },
                { 410, "disengage_game_request" },
                { 411, "game_disengaged_request" },
                { 412, "async_unlink_device_request" },
                { 413, "async_device_unlinked_request" },
                { 414, "estimate_game_engagement_duration_request" },
                { 415, "game_engagement_duration_estimation_request" },
                { 500, "action_required_request" },
                { 501, "commit_action_request" },
                { 502, "multicast_data_request" },
                { 503, "client_data_request" },
                { 504, "player_timeout_request" },
                { 505, "error_request" },
                { 506, "player_presence_update_request" },
                { 507, "game_over_request" },
                { 508, "game_outcome_request" },
                { 510, "waiting_messages_request" },
                { 511, "whats_new_pussycat_request" },
                { 512, "game_status_report_request" },
                { 513, "game_forfeit_request" },
                { 514, "game_forfeited_request" },
                { 515, "async_buddy_list_request" },
                { 516, "async_buddy_list_content_request" },
                { 517, "async_buddy_presence_partial_update_request" },
                { 518, "async_buddy_management_request" },
                { 519, "async_buddy_added_request" },
                { 520, "async_buddy_removed_request" },
                { 522, "game_outcome_confirmation_request" },
                { 523, "action_commited_request" },
                { 524, "multicast_chat_request" },
                { 525, "client_chat_request" },
                { 526, "client_chat_blocked_request" },
                { 527, "register_presence_request" },
                { 528, "unregister_presence_request" },
                { 529, "game_abort_request" },
                { 530, "game_aborted_request" },
                { 531, "game_aborted_confirmation_request" },
                { 532, "subscribe_presence_service_request" },
                { 533, "unsubscribe_presence_service_request" },
                { 534, "switched_to_game_request" },
                { 535, "get_chat_history_request" },
                { 536, "client_chat_history_request" },
                { 537, "player_replaced_request" },
                { 538, "leave_sync_game_request" },
                { 539, "resume_sync_game_request" },
                { 540, "answer_invitation_request" },
                { 541, "invitation_answered_request" },
                { 542, "pause_clock_request" },
                { 543, "clock_paused_request" },
                { 544, "resume_clock_request" },
                { 545, "clock_resumed_request" },
                { 546, "get_clocks_request" },
                { 547, "clocks_status_request" },
                { 560, "async_ignore_list_request" },
                { 561, "async_ignore_list_content_request" },
                { 562, "async_ignore_management_request" },
                { 563, "async_ignore_added_request" },
                { 564, "async_ignore_removed_request" },
                { 565, "user_update_data_required_request" },
                { 566, "update_user_data_request" },
                { 567, "user_data_updated_request" },
                { 600, "enter_lobby_request" },
                { 601, "lobby_entered_request" },
                { 602, "exit_lobby_request" },
                { 603, "lobby_exited_request" },
                { 604, "lobby_player_list_request" },
                { 605, "ask_player_info_request" },
                { 606, "lobby_player_info_request" },
                { 607, "lobby_create_game_request" },
                { 608, "lobby_game_created_request" },
                { 609, "lobby_game_list_request" },
                { 610, "lobby_join_game_request" },
                { 611, "lobby_new_player_request" },
                { 612, "lobby_join_denied_request" },
                { 613, "lobby_leave_game_request" },
                { 614, "lobby_player_left_game_request" },
                { 620, "subscribe_to_observable_game_list_request" },
                { 621, "subscribed_to_observable_game_list_request" },
                { 622, "observable_game_list_request" },
                { 650, "start_observe_game_request" },
                { 651, "stop_observe_game_request" },
                { 652, "game_observed_request" },
                { 777, "ping_request" }
            };
        }

        public static object GetRequestByMessage(com.daysofwonder.async.Message message)
        {
            int tag = message.request_number;

            if (RequestMapByTag.ContainsKey(tag))
            {
                string memberName = RequestMapByTag[tag];
                Type messageType = message.GetType();
                object request = messageType.GetProperty(memberName).GetValue(message, null);
                return request;
            }

            return null;
        }
    }
}
