#pragma once

#include <stdint.h>
#include <stdbool.h>
#include <SDL2/SDL.h>

// taken from the ptplay project and modified
enum ptbuttons
{
	PTB_DUMMY,

	// ALL SCREENS
	PTB_SONGNAME,
	PTB_SAMPLENAME,
	PTB_LOADSAMPLE,

	// POS ED. SCREEN
	PTB_PE_BADGE,
	PTB_PE_PATT,
	PTB_PE_PATTNAME,
	PTB_PE_SCROLLTOP,
	PTB_PE_SCROLLUP,
	PTB_PE_EXIT,
	PTB_PE_SCROLLDOWN,
	PTB_PE_SCROLLBOT,

	// EDIT OP. SCREEN
	PTB_EO_TITLEBAR,
	PTB_EO_1,
	PTB_EO_2,
	PTB_EO_3,
	PTB_EO_EXIT,

	// EDIT OP. SCREEN #1
	PTB_EO_TRACK_NOTE_UP,
	PTB_EO_PATT_NOTE_UP,
	PTB_EO_TRACK_NOTE_DOWN,
	PTB_EO_PATT_NOTE_DOWN,
	PTB_EO_TRACK_OCTA_UP,
	PTB_EO_PATT_OCTA_UP,
	PTB_EO_TRACK_OCTA_DOWN,
	PTB_EO_PATT_OCTA_DOWN,

	// EDIT OP. SCREEN #2
	PTB_EO_RECORD,
	PTB_EO_DELETE,
	PTB_EO_KILL,
	PTB_EO_QUANTIZE,
	PTB_EO_EXCHGE,
	PTB_EO_COPY,
	PTB_EO_METRO_1,
	PTB_EO_METRO_2,
	PTB_EO_FROM,
	PTB_EO_FROM_NUM,
	PTB_EO_FROM_UP,
	PTB_EO_FROM_DOWN,
	PTB_EO_KEYS,
	PTB_EO_TO,
	PTB_EO_TO_NUM,
	PTB_EO_TO_UP,
	PTB_EO_TO_DOWN,

	// EDIT OP. SCREEN #3
	PTB_EO_MIX,
	PTB_EO_ECHO,
	PTB_EO_POS,
	PTB_EO_POS_NUM,
	PTB_EO_POS_UP,
	PTB_EO_POS_DOWN,
	PTB_EO_BOOST,
	PTB_EO_FILTER,
	PTB_EO_MOD,
	PTB_EO_MOD_NUM,
	PTB_EO_MOD_UP,
	PTB_EO_MOD_DOWN,
	PTB_EO_X_FADE,
	PTB_EO_BACKWD,
	PTB_EO_CB,
	PTB_EO_CHORD,
	PTB_EO_FU,
	PTB_EO_FD,
	PTB_EO_UPSAMP,
	PTB_EO_DNSAMP,
	PTB_EO_VOL,
	PTB_EO_VOL_NUM,
	PTB_EO_VOL_UP,
	PTB_EO_VOL_DOWN,

	// EDIT OP. SCREEN #4
	PTB_EO_DOCHORD,
	PTB_EO_MAJOR,
	PTB_EO_MAJOR7,
	PTB_EO_NOTE1,
	PTB_EO_NOTE1_UP,
	PTB_EO_NOTE1_DOWN,
	PTB_EO_RESET,
	PTB_EO_MINOR,
	PTB_EO_MINOR7,
	PTB_EO_NOTE2,
	PTB_EO_NOTE2_UP,
	PTB_EO_NOTE2_DOWN,
	PTB_EO_UNDO,
	PTB_EO_SUS4,
	PTB_EO_MAJOR6,
	PTB_EO_NOTE3,
	PTB_EO_NOTE3_UP,
	PTB_EO_NOTE3_DOWN,
	PTB_EO_LENGTH,
	PTB_EO_MINOR6,
	PTB_EO_NOTE4,
	PTB_EO_NOTE4_UP,
	PTB_EO_NOTE4_DOWN,

	// DISK OP. SCREEN
	PTB_DO_PACKMOD,
	PTB_DO_MODARROW,
	PTB_DO_LOADMODULE,
	PTB_DO_SAVEMODULE,
	PTB_DO_SAMPLEFORMAT,
	PTB_DO_SAMPLEARROW,
	PTB_DO_LOADSAMPLE,
	PTB_DO_SAVESAMPLE,
	PTB_DO_DATAPATH,
	PTB_DO_PARENT,
	PTB_DO_REFRESH,
	PTB_DO_SCROLLTOP,
	PTB_DO_SCROLLUP,
	PTB_DO_EXIT,
	PTB_DO_SCROLLDOWN,
	PTB_DO_SCROLLBOT,
	PTB_DO_FILEAREA,

	// MAIN SCREEN
	PTB_QUIT,
	PTB_PLAY,
	PTB_PATTERN,
	PTB_EDIT,
	PTB_RECORD,
	PTB_STOP,
	PTB_CLEAR,
	PTB_EDITOP,
	PTB_DISKOP,
	PTB_MOD2WAV,
	PTB_POSED,
	PTB_PAT2SMP,
	PTB_SAMPLER,
	PTB_CHAN1,
	PTB_CHAN2,
	PTB_CHAN3,
	PTB_CHAN4,
	PTB_ABOUT,
	PTB_POSS,
	PTB_POSU,
	PTB_POSD,
	PTB_PATTERNS,
	PTB_PATTERNU,
	PTB_PATTERND,
	PTB_LENGTHS,
	PTB_LENGTHU,
	PTB_LENGTHD,
	PTB_FTUNEU,
	PTB_FTUNED,
	PTB_SAMPLES,
	PTB_SAMPLEU,
	PTB_SAMPLED,
	PTB_SVOLUMES,
	PTB_SVOLUMEU,
	PTB_SVOLUMED,
	PTB_SLENGTHS,
	PTB_SLENGTHU,
	PTB_SLENGTHD,
	PTB_SREPEATS,
	PTB_SREPEATU,
	PTB_SREPEATD,
	PTB_SREPLENS,
	PTB_SREPLENU,
	PTB_SREPLEND,
	PTB_TEMPOU,
	PTB_TEMPOD,
	PTB_POS,
	PTB_POSINS,
	PTB_POSDEL,
	PTB_VISUALS,
	PTB_PATTBOX,
	PTB_PATTDATA,

	// SAMPLER SCREEN
	PTB_SA_EXIT,
	PTB_SA_PLAYWAVE,
	PTB_SA_SHOWRANGE,
	PTB_SA_ZOOMOUT,
	PTB_SA_STOP,
	PTB_SA_PLAYDISPLAY,
	PTB_SA_SHOWALL,
	PTB_SA_RANGEALL,
	PTB_SA_LOOP,
	PTB_SA_PLAYRANGE,
	PTB_SA_RANGECENTER,
	PTB_SA_RANGEBEG,
	PTB_SA_RANGEEND,
	PTB_SA_CUT,
	PTB_SA_COPY,
	PTB_SA_PASTE,
	PTB_SA_VOLUME,
	PTB_SA_TUNETONE,
	PTB_SA_FIXDC,
	PTB_SA_FILTERS,
	PTB_SA_SAMPLE,
	PTB_SA_RESAMPLE,
	PTB_SA_RESAMPLENOTE,
	PTB_SA_SAMPLEAREA,
	PTB_SA_ZOOMBARAREA,
	PTB_SA_VOL_FROM_NUM,
	PTB_SA_VOL_TO_NUM,
	PTB_SA_FIL_LP_CUTOFF,
	PTB_SA_FIL_HP_CUTOFF
};

typedef struct guiButton_t
{
	int32_t x1, y1, x2, y2, b;
} guiButton_t;

enum
{
	POINTER_W = 16,
	POINTER_H = 16,

	POINTER_MODE_IDLE = 0,
	POINTER_MODE_EDIT = 1,
	POINTER_MODE_PLAY = 2,
	POINTER_MODE_MSG1 = 3,
	POINTER_MODE_RECORD = 4,
	POINTER_MODE_MSG2 = 5,

	POINTER_GRAY = 0,
	POINTER_YELLOW = 1,
	POINTER_BLUE = 2,
	POINTER_PURPLE = 3,
	POINTER_GREEN = 4,
	POINTER_RED = 5
};

#define NUM_CURSORS 6

#if defined __APPLE__ && defined __aarch64__
void armMacGhostMouseCursorFix(void);
#endif

void sampleUpButton(void);
void sampleDownButton(void);
void setMsgPointer(void);
void setErrPointer(void);
void pointerSetMode(uint8_t pointerMode, bool carry);
void pointerSetModeThreadSafe(uint8_t pointerMode, bool carry);
void pointerSetPreviousMode(void);
bool setSystemCursor(SDL_Cursor *cur);
void freeMouseCursors(void);
bool createMouseCursors(void);
void readMouseXY(void);
void updateMouseScaling(void);
void mouseWheelUpHandler(void);
void mouseWheelDownHandler(void);
void mouseButtonUpHandler(uint8_t mouseButton);
void mouseButtonDownHandler(uint8_t mouseButton);
void handleGUIButtonRepeat(void);
void updateMouseCounters(void);

extern SDL_Cursor *cursors[NUM_CURSORS];
