using System.Drawing;
using System.Windows.Forms;
using Remiss.Core.Models;
namespace Remiss.App;
///
/// Steg [1]: sökbar lista över mottagningar. Byggd helt i kod – ingen designer.
/// Avbryt (Esc / stäng / knapp) ger och
/// = null, vilket anroparen tolkar som "städa och avsluta".
///
public sealed class MottagningDialog : Form
{
private readonly IReadOnlyList _all;
private readonly TextBox _search = new();
private readonly ListBox _list = new();
private readonly Button _ok = new();
private readonly Button _cancel = new();
public Mottagning? SelectedMottagning { get; private set; }
public MottagningDialog(IReadOnlyList mottagningar)
{
_all = mottagningar;
Text = "Välj mottagning";
StartPosition = FormStartPosition.CenterScreen;
FormBorderStyle = FormBorderStyle.Sizable;
MinimizeBox = false;
MaximizeBox = false;
ShowInTaskbar = true;
MinimumSize = new Size(420, 360);
ClientSize = new Size(460, 520);
var layout = new TableLayoutPanel
{
Dock = DockStyle.Fill,
ColumnCount = 1,
RowCount = 3,
Padding = new Padding(12),
};
layout.RowStyles.Add(new RowStyle(SizeType.Absolute, 30));
layout.RowStyles.Add(new RowStyle(SizeType.Percent, 100));
layout.RowStyles.Add(new RowStyle(SizeType.Absolute, 48));
_search.Dock = DockStyle.Fill;
_search.PlaceholderText = "Sök mottagning eller HSA-id…";
_search.TextChanged += (_, _) => ApplyFilter();
_search.KeyDown += SearchKeyDown;
_list.Dock = DockStyle.Fill;
_list.IntegralHeight = false;
_list.DoubleClick += (_, _) => TryAccept();
_list.SelectedIndexChanged += (_, _) => _ok.Enabled = _list.SelectedItem is Mottagning;
_ok.Text = "OK";
_ok.Enabled = false;
_ok.AutoSize = true;
_ok.Padding = new Padding(12, 4, 12, 4);
_ok.Click += (_, _) => TryAccept();
_cancel.Text = "Avbryt";
_cancel.AutoSize = true;
_cancel.Padding = new Padding(12, 4, 12, 4);
_cancel.DialogResult = DialogResult.Cancel;
var buttons = new FlowLayoutPanel
{
Dock = DockStyle.Fill,
FlowDirection = FlowDirection.RightToLeft,
};
buttons.Controls.Add(_cancel);
buttons.Controls.Add(_ok);
layout.Controls.Add(_search, 0, 0);
layout.Controls.Add(_list, 0, 1);
layout.Controls.Add(buttons, 0, 2);
Controls.Add(layout);
AcceptButton = _ok;
CancelButton = _cancel;
ApplyFilter();
}
private void ApplyFilter()
{
var query = _search.Text.Trim();
IEnumerable matches = string.IsNullOrEmpty(query)
? _all
: _all.Where(m =>
m.Namn.Contains(query, StringComparison.CurrentCultureIgnoreCase) ||
m.HsaId.Contains(query, StringComparison.OrdinalIgnoreCase));
_list.BeginUpdate();
_list.Items.Clear();
foreach (var m in matches)
_list.Items.Add(m);
_list.EndUpdate();
if (_list.Items.Count > 0)
_list.SelectedIndex = 0;
_ok.Enabled = _list.SelectedItem is Mottagning;
}
private void SearchKeyDown(object? sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Down && _list.Items.Count > 0)
{
_list.Focus();
e.Handled = true;
}
}
private void TryAccept()
{
if (_list.SelectedItem is not Mottagning m)
return;
SelectedMottagning = m;
DialogResult = DialogResult.OK;
Close();
}
}