#include "button.h"

#include "math.h"

void Button::_event(const SDL_Event &ev) {
	if (state == BUTTON_STATE_OFF) {
		return;
	}

	switch (ev.type) {
		case SDL_MOUSEMOTION: {
			int x = ev.motion.x;
			int y = ev.motion.y;

			if (rect.x < x && rect.x + rect.w > x && rect.y < y && rect.y + rect.w > y) {
				state = BUTTON_STATE_HOVER;
			} else {
				state = BUTTON_STATE_UP;
			}

			break;
		}
		case SDL_MOUSEBUTTONDOWN: {
			int x = ev.motion.x;
			int y = ev.motion.y;

			if (rect.x < x && rect.x + rect.w > x && rect.y < y && rect.y + rect.w > y) {
				state = BUTTON_STATE_DOWN;
			}

			break;
		}
		case SDL_MOUSEBUTTONUP: {
			int x = ev.motion.x;
			int y = ev.motion.y;

			if (rect.x < x && rect.x + rect.w > x && rect.y < y && rect.y + rect.w > y) {
				state = BUTTON_STATE_HOVER;

				if (on_click) {
					on_click();
				}
			} else {
				state = BUTTON_STATE_UP;
			}

			break;
		}
	}
}

void Button::_update(float delta) {
}

void Button::_render() {
	if (state == BUTTON_STATE_UP) {
		if (up) {
			up->set_transform(rect);
			up->draw();
		}
	} else if (state == BUTTON_STATE_HOVER) {
		if (hover) {
			hover->set_transform(rect);
			hover->draw();
		}
	} else if (state == BUTTON_STATE_DOWN) {
		if (down) {
			down->set_transform(rect);
			down->draw();
		}
	} else if (state == BUTTON_STATE_OFF) {
		if (off) {
			off->set_transform(rect);
			off->draw();
		}
	}
}

Button::Button() : Widget() {
	state = BUTTON_STATE_UP;

	up = nullptr;
	down = nullptr;
	hover = nullptr;
	off = nullptr;
}

Button::~Button() {
}