#pragma once

#include "..\munga\style.h"

//########################################################################
//############################ MFDSplitView ##############################
//########################################################################
//
// One desktop window showing a single cockpit display, used by SVGA16's
// split mode (L4MFDSPLIT=1). The pod hardware packed the five monochrome
// MFDs into the color channels of two video outputs and mounted the map
// display rotated; on a desktop each display gets its own window instead.
//
// Each window also carries its display's physical button bank, exactly
// as mounted in the pod (geometry per vRIO's CockpitLayout):
//   - MFDs: a 4x2 cluster - 4 red buttons above the glass, 4 below,
//     RIO addresses descending from the cluster anchor (top-left = hi).
//   - The map ("secondary screen"): 6 amber buttons down each side -
//     Secondary 0x10-0x15 on the left, Screen 0x18-0x1D on the right
//     (the remaining column addresses are Tesla relays, not buttons).
// Buttons light from the lamp state the game commands (via PadRIO) and
// press/release RIO units with the mouse.
//
// SVGA16 fills Pixels() (32bpp top-down, sourceWidth x sourceHeight as
// passed - already swapped by the caller for the rotated map) and calls
// Repaint(). Closing a view window just hides it.
//
class MFDSplitView
{
public:
	enum ButtonStyle
	{
		NoButtons = 0,
		MFDStrips,			// 4 above + 4 below, addresses descend from anchorA
		SideColumns			// 6 per side; anchorA = left base, anchorB = right base
	};

	// With a parent, the view is created as a chrome-less child window
	// inside the single cockpit window (x/y in parent client coords);
	// without one it is its own draggable desktop window.
	MFDSplitView(
		const char *title,
		int source_width,
		int source_height,
		int display_width,
		int display_height,
		int x,
		int y,
		ButtonStyle button_style = NoButtons,
		int anchorA = 0,
		int anchorB = 0,
		void *parent = 0
	);

	int
		ClientWidth() const
			{ return clientWidth; }
	int
		ClientHeight() const
			{ return clientHeight; }

	// Move the pane (child mode: parent client coords). Panes overlap
	// the viewscreen like the pod's bezels, so exact placement happens
	// after construction from the measured client sizes.
	void
		SetPosition(int x, int y);

	// Re-scale the glass (cockpit resized): the source buffer is
	// unchanged, only the destination size and the button geometry
	// derived from it.
	void
		Resize(int display_width, int display_height);

	~MFDSplitView();

	Logical
		TestInstance() const;

	unsigned long *
		Pixels()
			{ return pixels; }

	void
		Repaint();

	// Window-procedure callbacks (public for the registered WndProc)
	void
		Paint();
	void
		MouseDown(int x, int y);
	void
		MouseUp();

protected:
	void
		LayoutButtons(
			ButtonStyle button_style,
			int anchorA,
			int anchorB,
			int display_width,
			int display_height,
			int *client_width,
			int *client_height
		);

	struct ScreenButton
	{
		int	unit;
		int	x, y, w, h;
		int	amber;			// 0 = red family, 1 = amber family
	};

	enum { maxButtons = 20 };

	void
		*window;			// HWND
	void
		*blitHeader;		// BITMAPINFOHEADER for StretchDIBits
	unsigned long
		*pixels;
	int
		sourceWidth,
		sourceHeight;

	int
		displayX, displayY,
		displayW, displayH;
	int
		clientWidth, clientHeight;

	ScreenButton
		buttons[maxButtons];
	int
		buttonCount;
	int
		pressedIndex;

	// kept so the bank can be rebuilt when the cockpit re-scales
	ButtonStyle
		buttonStyle;
	int
		buttonAnchorA,
		buttonAnchorB;
};
