#pragma once

class Image
{
public:
    std::unique_ptr<uint8_t[]> m_data;
    int width = 0;
    int height = 0;
    int comp = 4;
    bool load(std::string filename);
    bool load_file(std::string filename);
    const uint8_t* data() const { return m_data.get(); }
    int size() const { return width * height * comp; }
    bool save(const std::string& path);
    void create(int w, int h) 
    { 
        width = w; 
        height = h;  
        comp = 4;
        m_data = std::make_unique<uint8_t[]>(size());
    }
    void copy_from(const uint8_t* data)
    {
        std::copy(data, data + size(), m_data.get());
    }
    void destroy()
    {
        width = 0;
        height = 0;
        comp = 0;
        m_data.reset();
    }
    void flip();
    // convert to grayscale and set opaque
    void gayscale_alpha();
    void create() { m_data = std::make_unique<uint8_t[]>(size()); }
    Image resize(int w, int h) const;
    Image resize_power2() const;
    Image resize_squared(const glm::u8vec4& bg) const;
};
