#pragma once

namespace ScreenCapture {
    
    // Enums
    enum class ImageFormat {
        PNG,
        JPEG,
        BMP,
        TIF,
        GIF,
        GIF_MULTIFRAME,
        DDS
    };
    
    enum class TiffCompression {
        None = 0,
        RLE = 1,
        LZW = 2,
        ZIP = 3
    };
    
    enum class DDSCompression {
        BC1,
        BC2,
        BC3,
        BC4,
        BC5,
        BC6H,
        BC7,
        RGBA
    };
    
    // Structures
    struct CaptureParams {
        std::wstring basePath;
        ImageFormat format = ImageFormat::PNG;
        float jpegQuality = 85.0f;
        float gifDuration = 3.0f;
        TiffCompression tiffMode = TiffCompression::None;
        DDSCompression ddsMode = DDSCompression::BC7;
        std::atomic<bool>* cancelFlag = nullptr;
    };
    
    struct CaptureResult {
        bool success = false;
        std::string message;
        std::wstring filepath;
    };
    
    // Function declarations - ALL functions used in the cpp file
    ImageFormat StringToImageFormat(const std::string& str);
    TiffCompression StringToTiffCompression(const std::string& str);
    DDSCompression StringToDDSCompression(const std::string& str);
    GUID GetWICCodec(ImageFormat format);
    std::wstring GetFileExtension(ImageFormat format);
    DXGI_FORMAT GetDXGIFormat(DDSCompression compression);
    
    // Helper function declarations
    void ConvertRGBAToBGRA(const DirectX::Image* img, uint8_t* bgraData);
    HRESULT SetupDesktopDuplication(
        Microsoft::WRL::ComPtr<ID3D11Device>& device,
        Microsoft::WRL::ComPtr<ID3D11DeviceContext>& context,
        Microsoft::WRL::ComPtr<IDXGIOutputDuplication>& duplication
    );
    HRESULT CaptureSingleFrame(
        ID3D11Device* device,
        ID3D11DeviceContext* context,
        IDXGIOutputDuplication* duplication,
        DirectX::ScratchImage& frameImage
    );
    
    // Main capture functions
    CaptureResult CaptureMultiFrameGIF(const CaptureParams& params);
    CaptureResult CaptureScreen(const CaptureParams& params);
    HRESULT SaveToWICFile(const DirectX::ScratchImage& image, const CaptureParams& params, const std::wstring& filepath);
}