local createVersion = require('/apis/libversion');

local command = ...;

local function printUsage()
  print('tuidemo usage:');
  print();
  print('\t\t\ttuidemo');
  print('\t\t\ttuidemo version');
  print('\t\t\ttuidemo help');
end

if command == 'version' or command == '-version' or command == '--version' then
  print('v' .. createVersion().forSelf());
  return;
end

if command == 'help' or command == '-help' or command == '--help' then
  printUsage();
  return;
end

if command ~= nil and command ~= '' then
  printUsage();
  return;
end

local createEventLoop = require('/apis/eventloop');
local createTui = require('/apis/libtui');

local eventloop = createEventLoop();
local ui = createTui(eventloop);

local Text = ui.Text;
local Button = ui.Button;
local Box = ui.Box;
local List = ui.List;

local page = 1;
local pageCount = 3;

local function previousPage()
  page = page - 1;
  if page < 1 then
    page = pageCount;
  end
  ui.rerender();
end

local function nextPage()
  page = page + 1;
  if page > pageCount then
    page = 1;
  end
  ui.rerender();
end

local function Header()
  return Box({
    direction = 'row',
    bgColor = colors.gray,
    children = {
      Text('Trap UI Demo', {
        flex = 1,
        color = colors.white,
        bgColor = colors.gray,
      }),
      Button('X', {
        color = colors.white,
        bgColor = colors.red,
        onClick = function(tui)
          tui.exitUI('closed');
        end,
      }),
    },
  });
end

local function PageText()
  return List({
    gap = 1,
    padding = 1,
    children = {
      Text('Text components render strings inside their assigned rectangle.'),
      Text('This line uses pink background and black foreground.', {
        color = colors.black,
        bgColor = colors.pink,
      }),
      Text('Resize the terminal to force a redraw.'),
    },
  });
end

local function PageLayout()
  return Box({
    direction = 'row',
    gap = 1,
    padding = 1,
    children = {
      Box({
        flex = 1,
        border = true,
        title = 'Left',
        children = {
          Text('flex = 1'),
        },
      }),
      Box({
        width = 18,
        border = true,
        title = 'Fixed',
        children = {
          Text('width = 18'),
        },
      }),
      Box({
        flex = 2,
        border = true,
        title = 'Right',
        children = {
          Text('flex = 2'),
        },
      }),
    },
  });
end

local function PageButtons()
  return List({
    gap = 1,
    padding = 1,
    children = {
      Text('Buttons are clickable hitboxes.'),
      Button('Click me to go next', {
        color = colors.black,
        bgColor = colors.lime,
        onClick = function()
          nextPage();
        end,
      }),
      Button('Exit demo', {
        color = colors.white,
        bgColor = colors.red,
        onClick = function(tui)
          tui.exitUI('button');
        end,
      }),
    },
  });
end

local function CurrentPage()
  if page == 1 then
    return PageText();
  end

  if page == 2 then
    return PageLayout();
  end

  return PageButtons();
end

local function Footer()
  return Box({
    direction = 'row',
    gap = 1,
    children = {
      Button('Previous', {
        onClick = function()
          previousPage();
        end,
      }),
      Text('Page ' .. page .. '/' .. pageCount, { flex = 1 }),
      Button('Next', {
        onClick = function()
          nextPage();
        end,
      }),
    },
  });
end

local function App()
  return Box({
    direction = 'column',
    children = {
      Header(),
      Box({
        flex = 1,
        border = true,
        title = 'Demo page ' .. page,
        children = {
          CurrentPage(),
        },
      }),
      Footer(),
    },
  });
end

local finalEvent = ui.render(App);

if finalEvent.type == 'terminate' then
  print('> User terminated the app');
elseif finalEvent.type == 'error' then
  print('> error name: ' .. tostring(finalEvent.error.name));
  print('> error reason/details: ' .. tostring(finalEvent.error.reason));
elseif finalEvent.type == 'exitUI' then
  print('> User exited the app using the UI');
end
