// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.

#pragma once

#include "CalcViewModel/DataLoaders/ICurrencyHttpClient.h"

namespace CalculatorApp
{
    namespace DataLoaders
    {
        class CurrencyHttpClient : public ICurrencyHttpClient
        {
        public:
            CurrencyHttpClient();

            static Platform::String ^ GetRawStaticDataResponse();
            static Platform::String ^ GetRawAllRatiosDataResponse();

            // ICurrencyHttpClient
            void SetSourceCurrencyCode(Platform::String ^ sourceCurrencyCode) override
            {
            }
            void SetResponseLanguage(Platform::String ^ responseLanguage) override
            {
            }

            virtual Windows::Foundation::IAsyncOperationWithProgress<Platform::String ^, Windows::Web::Http::HttpProgress> ^ GetCurrencyMetadata() override;
            virtual Windows::Foundation::IAsyncOperationWithProgress<Platform::String ^, Windows::Web::Http::HttpProgress> ^ GetCurrencyRatios() override;
            // ICurrencyHttpClient
        };

    public
        ref class MockAsyncOperationWithProgress sealed
            : public Windows::Foundation::IAsyncOperationWithProgress<Platform::String ^, Windows::Web::Http::HttpProgress>
        {
        public:
            MockAsyncOperationWithProgress(Platform::String ^ result);

            // IAsyncInfo
            virtual property Windows::Foundation::HResult ErrorCode
            {
                Windows::Foundation::HResult get();
            }

            virtual property unsigned int Id
            {
                unsigned int get()
                {
                    return 128u;
                }
            }

            virtual property Windows::Foundation::AsyncStatus Status
            {
                Windows::Foundation::AsyncStatus get()
                {
                    return Windows::Foundation::AsyncStatus::Completed;
                }
            }

            virtual void Cancel()
            {
            }
            virtual void Close()
            {
            }
            // IAsyncInfo

            // IAsyncOperationWithProgress
            virtual property Windows::Foundation::AsyncOperationProgressHandler<Platform::String^, Windows::Web::Http::HttpProgress>^ Progress
            {
                Windows::Foundation::AsyncOperationProgressHandler<Platform::String^, Windows::Web::Http::HttpProgress>^ get() { return nullptr; }
                void set(Windows::Foundation::AsyncOperationProgressHandler<Platform::String^, Windows::Web::Http::HttpProgress>^ handler) {}
            }

            virtual property Windows::Foundation::AsyncOperationWithProgressCompletedHandler<Platform::String^, Windows::Web::Http::HttpProgress>^ Completed
            {
                Windows::Foundation::AsyncOperationWithProgressCompletedHandler<Platform::String^, Windows::Web::Http::HttpProgress>^ get() { return nullptr; }
                void set(Windows::Foundation::AsyncOperationWithProgressCompletedHandler<Platform::String^, Windows::Web::Http::HttpProgress>^ handler) {}
            }

            virtual Platform::String^ GetResults() { return m_result; }
            // IAsyncOperationWithProgress

        private:
            Platform::String^ m_result;
        };
    }
}
