/*
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
* its licensors.
*
* For complete copyright and license terms please see the LICENSE at the root of this
* distribution (the "License"). All use of this software is governed by the License,
* or, if provided, by the license below or the license accompanying this file. Do not
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
*/

#pragma once

#include <Processing/ImageConvertJob.h>
#include <AzCore/Jobs/JobCompletion.h>

namespace ImageProcessing
{
    // The reason to have image preview class, we should keep the source image loaded once, 
    // we could restart conversion and cancel the old conversion at anytime when setting changed
    class ImagePreview
    {
    public:
        ImagePreview(const AZStd::string& inputImageFile, TextureSettings* textureSetting);
        ~ImagePreview();

        void InitializeJobSettings();
        void StartConvert();
        bool IsDone();
        float GetProgress();
        void Cancel();
        IImageObjectPtr GetOutputImage();

        // Output preview image for Asset Browser
        static bool GetProductTexturePreview(const char* fullProductFileName, QImage& previewImage, AZStd::string& productInfo, AZStd::string& productAlphaInfo);

    private:
        AZStd::string m_imageFileName;
        IImageObjectPtr m_inputImage;
        const TextureSettings* m_textureSetting;
        const PresetSettings* m_presetSetting;

        IImageObjectPtr m_outputImage;
        IImageObjectPtr m_outputAlphaImage;

        ImageConvertOutput m_output;

        AZStd::unique_ptr<AZ::JobManager> m_jobManager;
        AZStd::unique_ptr<AZ::JobCancelGroup> m_jobCancelGroup;
        AZStd::unique_ptr<AZ::JobContext> m_jobContext;
        AZStd::unique_ptr<ImageConvertJob> m_convertJob;
        AZ::JobCompletion m_doneJob;
    };
    
    // Get basic image info as string
    void GetImageInfoString(IImageObjectPtr image, bool isAlpha, AZStd::string& output);

}// namespace ImageProcessing