#include "WimpLib:BarIcon.h"

#include <stdio.h>
#include <string.h>

#include "swis.h"

#include "WimpLib:CIcon.h"
#include "WimpLib:Desktop.h"
#include "WimpLib:Exception.h"
#include "WimpLib:Mem.h"
#include "WimpLib:Task.h"

HIcon BarIcon_Create(const char* ptext, int buf_len, const char* psprite, bar_epos pos, int priority) throws(mem)
{
	volatile struct
	{
		HWind w;
		CIcon i;
	} icon;
	CSize size = Desktop_GetNamedSpriteSize(psprite);
	HIcon hi = HIcon_None;

	memset((void*) &icon, 0, sizeof(icon));
	icon.w = pos;
	icon.i.flags  = 0x1700311A;
	icon.i.box.x0 = 0;
	icon.i.box.x1 = (size.cx > 68) ? size.cx : 68;

	try
	{
		if (ptext)
		{
			icon.i.box.y0 = -16;
			icon.i.box.y1 = 84;
			if (buf_len * 16 > 68) icon.i.box.x1 = buf_len * 16;
			icon.i.flags += EIcon_Text;
			icon.i.data.it.buffer = throw_mem_alloc(buf_len);
			icon.i.data.it.buf_size = buf_len;
			snprintf(icon.i.data.it.buffer, buf_len, "%s", ptext);
			icon.i.data.it.validation = throw_mem_allocprint("S%s", psprite);
		}
		else
		{
			buf_len = 12;
			icon.i.box.y0 = 0;
			icon.i.box.y1 = 68;
			icon.i.data.is.sprite_name = throw_mem_alloc(buf_len);
			icon.i.data.is.sprite_name_length = buf_len;
			snprintf(icon.i.data.is.sprite_name, buf_len, "%s", psprite);
			icon.i.data.is.sprite_area = Task_GetSpriteArea();
		}

		// Wimp create icon
		throw_os(_swix(0x0400c2, _INR(0,1)|_OUT(0), priority, &icon, &hi));
	}
	catch
	{
		if (ptext)
		{
			mem_free(icon.i.data.it.buffer);
			mem_free(icon.i.data.it.validation);
		}
		else
		{
			mem_free(icon.i.data.is.sprite_name);
		}
		throw_current();
	}
	catch_end

	return hi;
}

void BarIcon_Delete(HIcon icon) throws(id)
{
	CIcon info;

	if (icon == HIcon_None) return;

	Icon_GetInfo(HWind_IconBar, icon, &info);

	if (info.flags & 0x100)
	{
		if (info.flags & 0x1)
		{
			mem_free(info.data.it.buffer);
			mem_free(info.data.it.validation);
		}
		else
			mem_free(info.data.is.sprite_name);
	}
	Icon_Delete(HWind_IconBar, icon);
}

void BarIcon_SetSprite(HIcon icon, const char* text) throws(id)
{
	CIcon info;

	Icon_GetInfo(HWind_IconBar, icon, &info);

	if ((info.flags & 0x100)
	&&  !(info.flags & 0x1))
	{
		strncpy(info.data.is.sprite_name, text, 12);
		Icon_ForceRedraw(HWind_IconBar, icon);
	}
}
