//
//  Picture+.swift
//  Adwaita
//
//  Created by david-swift on 21.04.24.
//

import CAdw
import Foundation

extension Picture {

    /// Load the picture from Foundation's `Data`.
    /// - Parameter data: The data.
    /// - Returns: The view.
    public func data(_ data: Data?) -> AnyView {
        let oldData = "old-data"
        return inspect { storage, updateProperties in
            if updateProperties {
                let pointer = storage.opaquePointer
                guard let data else {
                    if storage.fields[oldData] != nil {
                        g_object_unref(gtk_picture_get_paintable(pointer)?.cast())
                        gtk_picture_set_paintable(pointer, gdk_paintable_new_empty(0, 0))
                        storage.fields[oldData] = nil
                    }
                    return
                }
                guard data != storage.fields[oldData] as? Data else {
                    return
                }
                let bytes = data.withUnsafeBytes { ptr in
                    g_bytes_new(ptr.baseAddress, .init(data.count))
                }
                let texture = gdk_texture_new_from_bytes(bytes, nil)
                if let paintable = gtk_picture_get_paintable(pointer) {
                    g_object_unref(paintable.cast())
                }
                gtk_picture_set_paintable(pointer, texture)
                storage.fields[oldData] = data
            }
        }
    }

}
