#!/usr/bin/env ruby

# frozen_string_literal: true

require 'bundler/setup'
require 'vedeu'

class HorizontalAlignmentApp

  def self.geometry_stats(name)
    Vedeu.geometries.by_name(name)
  end
  def self.gl
    geometry_stats(:left_interface)
  end
  def self.gc
    geometry_stats(:centre_interface)
  end
  def self.gr
    geometry_stats(:right_interface)
  end

  class CentreHorizontalAlignmentView
    def render
      Vedeu.render do
        view(:centre_interface) do
          lines do
            line "x:#{gc.x}, xn:#{gc.xn} (w:#{gc.width})"
            line "y:#{gc.y}, yn:#{gc.yn} (h:#{gc.height})"
            line ""
            line "bx:#{gc.bx}, bxn:#{gc.bxn} (bw:#{gc.width})"
            line "by:#{gc.by}, byn:#{gc.byn} (bh:#{gc.height})"
            line ""
            line "The 'h', 'j', 'k' and 'l' keys will"
            line "move this view left, down, up, and"
            line "right respectively."
          end
        end
      end

      Vedeu.trigger(:_refresh_view_, :centre_interface)
    end

    def gc
      Vedeu.geometries.by_name(:centre_interface)
    end
  end

  Vedeu.bind(:_initialize_) { Vedeu.trigger(:_refresh_) }

  Vedeu.configure do
    debug!
    log '/tmp/vedeu_horizontal.log'
    renderers(Vedeu::Renderers::Terminal.new,
              Vedeu::Renderers::Text.new(filename: '/tmp/vedeu_horizontal.out'))
  end

  Vedeu.interface :left_interface do
    border do
      title 'Align: Left'
    end
    geometry do
      align_left 30
      height 10
    end
  end

  Vedeu.interface :centre_interface do
    border do
      title 'Align: Centre'
    end
    geometry do
      align_centre 40
      height 15
    end
  end

  Vedeu.interface :right_interface do
    border do
      title 'Align: Right'
    end
    geometry do
      align_right 30
      height 10
    end
  end

  Vedeu.keymap '_global_' do
    key('q') { Vedeu.exit }

    key('h') {
      Vedeu.trigger(:_view_left_, :centre_interface)

      HorizontalAlignmentApp::CentreHorizontalAlignmentView.new.render
    }
    key('j') {
      Vedeu.trigger(:_view_down_, :centre_interface)

      HorizontalAlignmentApp::CentreHorizontalAlignmentView.new.render
    }
    key('k') {
      Vedeu.trigger(:_view_up_, :centre_interface)

      HorizontalAlignmentApp::CentreHorizontalAlignmentView.new.render
    }
    key('l') {
      Vedeu.trigger(:_view_right_, :centre_interface)

      HorizontalAlignmentApp::CentreHorizontalAlignmentView.new.render
    }

    key('1') {
      Vedeu.trigger(:_maximise_, :left_interface)
    }
    key('2') {
      Vedeu.trigger(:_unmaximise_, :left_interface)
    }
    key('3') {
      Vedeu.trigger(:_maximise_, :centre_interface)
      HorizontalAlignmentApp::CentreHorizontalAlignmentView.new.render
    }
    key('4') {
      Vedeu.trigger(:_unmaximise_, :centre_interface)
      HorizontalAlignmentApp::CentreHorizontalAlignmentView.new.render
    }
    key('5') {
      Vedeu.trigger(:_maximise_, :right_interface)
    }
    key('6') {
      Vedeu.trigger(:_unmaximise_, :right_interface)
    }
  end

  Vedeu.render do
    view(:left_interface) do
      lines do
        line "x:#{gl.x}, xn:#{gl.xn} (w:#{gl.width})"
        line "y:#{gl.y}, yn:#{gl.yn} (h:#{gl.height})"
        line ""
        line "bx:#{gl.bx}, bxn:#{gl.bxn} (bw:#{gl.width})"
        line "by:#{gl.by}, byn:#{gl.byn} (bh:#{gl.height})"
      end
    end

    view(:centre_interface) do
      lines do
        line "x:#{gc.x}, xn:#{gc.xn} (w:#{gc.width})"
        line "y:#{gc.y}, yn:#{gc.yn} (h:#{gc.height})"
        line ""
        line "bx:#{gc.bx}, bxn:#{gc.bxn} (bw:#{gc.width})"
        line "by:#{gc.by}, byn:#{gc.byn} (bh:#{gc.height})"
        line ""
        line "The 'h', 'j', 'k' and 'l' keys will"
        line "move this view left, down, up, and"
        line "right respectively. The coordinates"
        line "will not change in this example"
        line "because they have not been"
        line "instructed to do so."
      end
    end

    view(:right_interface) do
      lines do
        line "x:#{gr.x}, xn:#{gr.xn} (w:#{gr.width})"
        line "y:#{gr.y}, yn:#{gr.yn} (h:#{gr.height})"
        line ""
        line "bx:#{gr.bx}, bxn:#{gr.bxn} (bw:#{gr.width})"
        line "by:#{gr.by}, byn:#{gr.byn} (bh:#{gr.height})"
      end
    end
  end

  def self.start(argv = ARGV)
    Vedeu::Launcher.execute!(argv)
  end

end # HorizontalAlignmentApp

HorizontalAlignmentApp.start