// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
// Standard Library
using System;
using System.Collections.Generic;
// Unity
using UnityEditor;
// GameKit
using AWS.GameKit.Editor.Windows.Settings.Pages.Achievements;
using AWS.GameKit.Editor.Windows.Settings.Pages.AllFeatures;
using AWS.GameKit.Editor.Windows.Settings.Pages.EnvironmentAndCredentials;
using AWS.GameKit.Editor.Windows.Settings.Pages.GameStateCloudSaving;
using AWS.GameKit.Editor.Windows.Settings.Pages.IdentityAndAuthentication;
using AWS.GameKit.Editor.Windows.Settings.Pages.Log;
using AWS.GameKit.Editor.Windows.Settings.Pages.UserGameplayData;
namespace AWS.GameKit.Editor.Windows.Settings
{
    /// 
    /// Holds references to every page that gets displayed in the AWS GameKit Settings window.
    /// 
    [Serializable]
    public class AllPages
    {
        // Before features
        public EnvironmentAndCredentialsPage EnvironmentAndCredentialsPage;
        public AllFeaturesPage AllFeaturesPage;
        // Features
        public IdentityAndAuthenticationPage IdentityAndAuthenticationPage;
        public GameStateCloudSavingPage GameStateCloudSavingPage;
        public AchievementsPage AchievementsPage;
        public UserGameplayDataPage UserGameplayDataPage;
        // After features
        public LogPage LogPage;
        private Dictionary PageTypeToPageInstanceMap => new Dictionary()
        {
            // Before features
            {PageType.EnvironmentAndCredentialsPage, EnvironmentAndCredentialsPage},
            {PageType.AllFeaturesPage, AllFeaturesPage},
            // Features
            {PageType.IdentityAndAuthenticationPage, IdentityAndAuthenticationPage},
            {PageType.GameStateCloudSavingPage, GameStateCloudSavingPage},
            {PageType.AchievementsPage, AchievementsPage},
            {PageType.UserGameplayDataPage, UserGameplayDataPage},
            // After features
            {PageType.LogPage, LogPage},
        };
        /// 
        /// Create a default AllPages.
        /// 
        public void Initialize(SettingsDependencyContainer dependencies, SerializedProperty serializedProperty)
        {
            // Before features
            EnvironmentAndCredentialsPage.Initialize(dependencies, serializedProperty.FindPropertyRelative(nameof(EnvironmentAndCredentialsPage)));
            // Features
            IdentityAndAuthenticationPage.Initialize(dependencies, serializedProperty.FindPropertyRelative(nameof(IdentityAndAuthenticationPage)));
            GameStateCloudSavingPage.Initialize(dependencies, serializedProperty.FindPropertyRelative(nameof(GameStateCloudSavingPage)));
            AchievementsPage.Initialize(dependencies, serializedProperty.FindPropertyRelative(nameof(AchievementsPage)));
            UserGameplayDataPage.Initialize(dependencies, serializedProperty.FindPropertyRelative(nameof(UserGameplayDataPage)));
            // Must be intialized after features
            AllFeaturesPage.Initialize(dependencies);
            
            // After features
            LogPage.Initialize(serializedProperty.FindPropertyRelative(nameof(LogPage)));
        }
        /// 
        /// Get the page instance corresponding to the specified page type.
        /// 
        public Page GetPage(PageType pageType)
        {
            if (PageTypeToPageInstanceMap.TryGetValue(pageType, out Page page))
            {
                return page;
            }
            throw new ArgumentException($"No page instance found for PageType: {pageType}. This error should not be possible at runtime. It should be caught by unit tests.");
        }
    }
}