diff --git a/GestionePizzeForm.cs b/GestionePizzeForm.cs index ed86154..c7b6f0f 100644 --- a/GestionePizzeForm.cs +++ b/GestionePizzeForm.cs @@ -1,10 +1,355 @@ +using System.Net.Http.Json; + namespace PizzaExpress_Client { public partial class GestionePizzeForm : Form { + private readonly HttpClient _httpClient; + + private List _tutteLePizze = new(); + + private readonly ListBox _lstPizze; + private readonly TextBox _txtId, _txtNome, _txtPrezzo, _txtRicerca, _txtNote; + private readonly ComboBox _cmbCategoria; + + private readonly Button _btnAggiungi, _btnAggiorna, _btnElimina, _btnElenco, _btnCosto; + public GestionePizzeForm() { - InitializeComponent(); + Text = "Gestione Pizze (Database SQLite)"; + + // ============================= + // DIMENSIONE FISSA DELLA FINESTRA + // ============================= + Size = new Size(1000, 600); + MinimumSize = new Size(1000, 600); + MaximumSize = new Size(1000, 600); + + FormBorderStyle = FormBorderStyle.FixedDialog; + MaximizeBox = false; + StartPosition = FormStartPosition.CenterScreen; + + _httpClient = new HttpClient { BaseAddress = new Uri("http://localhost:5000/") }; + + // ====================================================== + // PANNELLO SUPERIORE + // ====================================================== + var pnlTop = new Panel + { + Dock = DockStyle.Top, + Height = 60 + }; + + var lblTitolo = new Label + { + Text = "Gestione Pizze", + Font = new Font("Arial", 20, FontStyle.Bold), + Location = new Point(10, 15), + AutoSize = true + }; + + _btnCosto = new Button + { + Text = "Costo", + Location = new Point(900, 15), + Size = new Size(70, 30) + }; + _btnCosto.Click += BtnCosto_Click; + + pnlTop.Controls.Add(lblTitolo); + pnlTop.Controls.Add(_btnCosto); + + // ====================================================== + // PANNELLO SINISTRO + // ====================================================== + var pnlLeft = new Panel + { + Dock = DockStyle.Left, + Width = 300, + Padding = new Padding(10) + }; + + _txtRicerca = new TextBox + { + PlaceholderText = "Cerca pizza...", + Dock = DockStyle.Top, + Height = 30 + }; + _txtRicerca.TextChanged += (s, e) => FiltraPizze(); + + _btnElenco = new Button + { + Text = "Ricarica elenco", + Dock = DockStyle.Top, + Height = 35 + }; + _btnElenco.Click += async (s, e) => await CaricaPizze(); + + _lstPizze = new ListBox + { + Dock = DockStyle.Fill, + Font = new Font("Consolas", 10) + }; + _lstPizze.SelectedIndexChanged += LstPizze_SelectedIndexChanged; + + pnlLeft.Controls.Add(_lstPizze); + pnlLeft.Controls.Add(_btnElenco); + pnlLeft.Controls.Add(_txtRicerca); + + // ====================================================== + // PANNELLO DESTRO — ALLINEAMENTO PERFETTO A SINISTRA + // ====================================================== + var pnlRight = new TableLayoutPanel + { + Dock = DockStyle.Fill, + ColumnCount = 2, + Padding = new Padding(10), + }; + + // Colonna etichette stretta, colonna input larga e allineata ai pulsanti + pnlRight.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 18)); + pnlRight.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 82)); + + pnlRight.Controls.Add(new Label + { + Text = "Modifica pizza", + Font = new Font("Arial", 16, FontStyle.Bold), + AutoSize = true + }, 0, 0); + pnlRight.SetColumnSpan(pnlRight.GetControlFromPosition(0, 0), 2); + + // ID + _txtId = new TextBox { Visible = false }; + pnlRight.Controls.Add(new Label { Text = "Id:", Visible = false }, 0, 1); + pnlRight.Controls.Add(_txtId, 1, 1); + + // Nome + pnlRight.Controls.Add(new Label { Text = "Nome:" }, 0, 2); + _txtNome = new TextBox + { + Width = 300, + Anchor = AnchorStyles.Left + }; + pnlRight.Controls.Add(_txtNome, 1, 2); + + // Prezzo + pnlRight.Controls.Add(new Label { Text = "Prezzo:" }, 0, 3); + _txtPrezzo = new TextBox + { + Width = 150, + Anchor = AnchorStyles.Left + }; + pnlRight.Controls.Add(_txtPrezzo, 1, 3); + + // Categoria + pnlRight.Controls.Add(new Label { Text = "Categoria:" }, 0, 4); + _cmbCategoria = new ComboBox + { + Width = 200, + DropDownStyle = ComboBoxStyle.DropDown, + Anchor = AnchorStyles.Left + }; + _cmbCategoria.Items.AddRange(new[] { "Classica", "Speciale", "Gourmet" }); + pnlRight.Controls.Add(_cmbCategoria, 1, 4); + + // NOTE — Campo grande e allineato + pnlRight.Controls.Add(new Label { Text = "Note:" }, 0, 5); + + _txtNote = new TextBox + { + Multiline = true, + Height = 230, + Width = 500, + ScrollBars = ScrollBars.Vertical, + Anchor = AnchorStyles.Left + }; + + pnlRight.Controls.Add(_txtNote, 1, 5); + + // ====================================================== + // PANNELLO PULSANTI — ALLINEATO COL CAMPO NOME (SX) + // ====================================================== + var pnlButtons = new FlowLayoutPanel + { + FlowDirection = FlowDirection.LeftToRight, + AutoSize = true, + Anchor = AnchorStyles.Left, + Padding = new Padding(0, 10, 0, 0) + }; + + _btnAggiungi = new Button { Text = "Aggiungi", Width = 120 }; + _btnAggiorna = new Button { Text = "Aggiorna", Width = 120 }; + _btnElimina = new Button { Text = "Elimina", Width = 120 }; + + _btnAggiungi.Click += async (s, e) => await AggiungiPizza(); + _btnAggiorna.Click += async (s, e) => await AggiornaPizza(); + _btnElimina.Click += async (s, e) => await EliminaPizza(); + + pnlButtons.Controls.Add(_btnAggiungi); + pnlButtons.Controls.Add(_btnAggiorna); + pnlButtons.Controls.Add(_btnElimina); + + pnlRight.Controls.Add(pnlButtons, 1, 6); + + // ====================================================== + Controls.Add(pnlRight); + Controls.Add(pnlLeft); + Controls.Add(pnlTop); + + Load += async (s, e) => await CaricaPizze(); + } + + // ====================================================================== + private async Task CaricaPizze() + { + try + { + var pizze = await _httpClient.GetFromJsonAsync>("api/pizze"); + _tutteLePizze = pizze ?? new List(); + } + catch + { + MessageBox.Show("Errore nella connessione al server."); + _tutteLePizze = new List(); + } + + FiltraPizze(); + } + + private void FiltraPizze() + { + string filtro = _txtRicerca.Text.ToLower(); + _lstPizze.Items.Clear(); + + foreach (var p in _tutteLePizze) + { + if (string.IsNullOrWhiteSpace(filtro) || + p.Nome.ToLower().Contains(filtro) || + p.Categoria.ToLower().Contains(filtro)) + { + _lstPizze.Items.Add(p.ToString()); + } + } + } + + private void LstPizze_SelectedIndexChanged(object? sender, EventArgs e) + { + if (_lstPizze.SelectedIndex < 0) + return; + + var p = _tutteLePizze[_lstPizze.SelectedIndex]; + + _txtId.Text = p.Id.ToString(); + _txtNome.Text = p.Nome; + _txtPrezzo.Text = p.Prezzo.ToString(); + _cmbCategoria.Text = p.Categoria; + _txtNote.Text = p.Note; + } + + // ====================================================================== + private async Task AggiungiPizza() + { + if (!decimal.TryParse(_txtPrezzo.Text, out decimal prezzo)) + { + MessageBox.Show("Prezzo non valido."); + return; + } + + var pizza = new Pizza + { + Nome = _txtNome.Text, + Prezzo = prezzo, + Categoria = _cmbCategoria.Text, + Note = _txtNote.Text + }; + + var resp = await _httpClient.PostAsJsonAsync("api/pizze", pizza); + + if (!resp.IsSuccessStatusCode) + { + var err = await resp.Content.ReadFromJsonAsync>(); + MessageBox.Show(err["message"]); + return; + } + + await CaricaPizze(); + } + + // ====================================================================== + private async Task AggiornaPizza() + { + if (!int.TryParse(_txtId.Text, out int id)) + { + MessageBox.Show("ID non valido."); + return; + } + + if (!decimal.TryParse(_txtPrezzo.Text, out decimal prezzo)) + { + MessageBox.Show("Prezzo non valido."); + return; + } + + var pizza = new Pizza + { + Id = id, + Nome = _txtNome.Text, + Prezzo = prezzo, + Categoria = _cmbCategoria.Text, + Note = _txtNote.Text + }; + + var resp = await _httpClient.PutAsJsonAsync($"api/pizze/{id}", pizza); + + if (!resp.IsSuccessStatusCode) + { + var err = await resp.Content.ReadFromJsonAsync>(); + MessageBox.Show(err["message"]); + return; + } + + await CaricaPizze(); + } + + // ====================================================================== + private async Task EliminaPizza() + { + if (!int.TryParse(_txtId.Text, out int id)) + { + MessageBox.Show("Seleziona una pizza da eliminare."); + return; + } + + await _httpClient.DeleteAsync($"api/pizze/{id}"); + + await CaricaPizze(); + + _lstPizze.ClearSelected(); + _txtId.Clear(); + _txtNome.Clear(); + _txtPrezzo.Clear(); + _txtNote.Clear(); + _cmbCategoria.SelectedIndex = -1; + } + + // ====================================================================== + private void BtnCosto_Click(object? sender, EventArgs e) + { + if (_lstPizze.SelectedItem == null) + { + MessageBox.Show("Seleziona una pizza."); + return; + } + + var s = _lstPizze.SelectedItem.ToString(); + var parts = s.Split('-'); + + if (parts.Length >= 3) + { + string nome = parts[1].Trim(); + string prezzo = parts[2].Replace("€", "").Trim(); + MessageBox.Show($"La pizza {nome} costa {prezzo}€."); + } } } }