import clay;

import core.stdc.stdlib;

__gshared:

Clay_LayoutConfig layoutElement = { padding: {5} };

extern(C) void main()
{
    ulong totalMemorySize = Clay_MinMemorySize();
    Clay_Arena clayMemory = {
        label: str("Clay Memory Arena"),
        capacity: totalMemorySize,
        memory: cast(char*)malloc(totalMemorySize)
    };

    Clay_Initialize(clayMemory, Clay_Dimensions(1024,768));
    Clay_BeginLayout();
    if (ClayBegin( Rectangle(color: Clay_Color(255,255,255,0)), Layout(layoutElement)))
    {   }
    ClayEnd();
}


// helper functions
Clay_String str(string it)
{
    return Clay_String(cast(int)it.length, it.ptr);
}

bool ClayBegin(A...)(A configs)
{
    Clay__OpenElement();
    foreach(config; configs)
    {
        alias T = typeof(config);
        static if (is(T == Clay_ElementId))
        {
            Clay__AttachId(config);
        }
        else static if(is(T == Clay_LayoutConfig*))
        {
            Clay__AttachLayoutConfig(config);
        }
        else static if(is(T == Clay_ElementConfig))
        {
            Clay__AttachElementConfig(config.config, config.type);
        }
        else static assert(0, "unsupported " ~ typeof(config).stringof);
    }

    Clay__ElementPostConfiguration();
    return true;
}

void ClayEnd()
{
    Clay__CloseElement();
}

Clay_ElementId Id(string label)
{
     return Clay__HashString(str(label), 0, 0);
}

Clay_LayoutConfig* Layout(lazy Clay_Sizing sizing = Clay_Sizing.init)
{
    Clay_LayoutConfig config;
    config.sizing = sizing;
    return Clay__StoreLayoutConfig(config);
}

Clay_LayoutConfig* Layout(Clay_LayoutConfig config)
{
    return Clay__StoreLayoutConfig(config);
}

Clay_ElementConfig Rectangle(lazy Clay_Color color = Clay_Color.init)
{
    Clay_RectangleElementConfig config;
    config.color = color;

    Clay_ElementConfig ret;
    ret.type = Clay__ElementConfigType.CLAY__ELEMENT_CONFIG_TYPE_RECTANGLE;
    ret.config.rectangleElementConfig = Clay__StoreRectangleElementConfig(config);
    return ret;
}