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

#include "std.h"
#include "fileHelpers.h"
#include "winrt/Windows.Media.h"
#include "winrt/Windows.Storage.h"

EXTERN_C IMAGE_DOS_HEADER __ImageBase;

using namespace winrt;
using namespace winml;
using namespace wgi;
using namespace ws;

namespace FileHelpers
{    
    std::wstring GetModulePath()
    {
        std::wstring val;
        wchar_t modulePath[MAX_PATH] = { 0 };
        GetModuleFileNameW((HINSTANCE)&__ImageBase, modulePath, _countof(modulePath));
        wchar_t drive[_MAX_DRIVE];
        wchar_t dir[_MAX_DIR];
        wchar_t filename[_MAX_FNAME];
        wchar_t ext[_MAX_EXT];
        _wsplitpath_s(modulePath, drive, _MAX_DRIVE, dir, _MAX_DIR, filename, _MAX_FNAME, ext, _MAX_EXT);

        val = drive;
        val += dir;

        return val;
    }

    std::wstring GetWinMLPath()
    {
        // bool inboxDll = false;
        // TODO Add command line parsing
        // if (SUCCEEDED(WEX::TestExecution::RuntimeParameters::TryGetValue(L"inbox", inboxDll)) && inboxDll)
        // {
        //     return L"";
        // }
        return GetModulePath();
    }


    wgi::SoftwareBitmap GetSoftwareBitmapFromFile(const std::wstring& filePath)
    {
        auto storageFile = StorageFile::GetFileFromPathAsync(filePath).get();
        auto stream = storageFile.OpenAsync(FileAccessMode::Read).get();
        auto decoder = BitmapDecoder::CreateAsync(stream).get();
        IBitmapFrameWithSoftwareBitmap bitmapFrameWithSoftwareBitmap;
        decoder.as(bitmapFrameWithSoftwareBitmap);
        auto softwareBitmap = bitmapFrameWithSoftwareBitmap.GetSoftwareBitmapAsync(
            BitmapPixelFormat::Bgra8,
            BitmapAlphaMode::Ignore,
            BitmapTransform::BitmapTransform(),
            ExifOrientationMode::IgnoreExifOrientation,
            ColorManagementMode::DoNotColorManage
        ).get();
        return softwareBitmap;
    }

    winml::ImageFeatureValue LoadImageFeatureValue(const std::wstring& imagePath)
    {
        auto softwareBitmap = FileHelpers::GetSoftwareBitmapFromFile(FileHelpers::GetModulePath() + imagePath);
        auto videoFrame = wm::VideoFrame::CreateWithSoftwareBitmap(softwareBitmap);
        return ImageFeatureValue::CreateFromVideoFrame(videoFrame);
    }
}
