﻿using System;
using System.Data.SQLite;
using System.Windows;
using System.Windows.Controls;

namespace EcoRideDB {
    public enum BikeStatus {
        Available,
        Rented,
        Maintenance,
        Retired
    }

    public partial class AddBike : UserControl {
        private readonly string connectionStr = "Data Source=EcoRideDB.db;Version=3;";

        public AddBike() {
            InitializeComponent();
            cmbStatus.Items.Clear();
            cmbStatus.ItemsSource = Enum.GetValues(typeof(BikeStatus));
            cmbStatus.SelectedIndex = 0;
        }

        private void AddBike_Click(object sender, RoutedEventArgs e) {
            string type = txtBikeType.Text.Trim();
            string condition = txtCondition.Text.Trim();
            string status = cmbStatus.SelectedItem?.ToString() ?? BikeStatus.Available.ToString();
            string stationIdText = txtStationID.Text.Trim();
            int? stationId = null;

            if (string.IsNullOrWhiteSpace(type) || string.IsNullOrWhiteSpace(condition) || string.IsNullOrWhiteSpace(status)) {
                MessageBox.Show("Type, Condition, and Status are required.", "Warning", MessageBoxButton.OK, MessageBoxImage.Warning);
                return;
            }

            if (!string.IsNullOrWhiteSpace(stationIdText)) {
                if (int.TryParse(stationIdText, out int parsedId)) {
                    if (!StationExists(parsedId)) {
                        MessageBox.Show("Station ID does not exist.", "Warning", MessageBoxButton.OK, MessageBoxImage.Warning);
                        return;
                    }
                    stationId = parsedId;
                } else {
                    MessageBox.Show("Station ID must be a number.", "Warning", MessageBoxButton.OK, MessageBoxImage.Warning);
                    return;
                }
            }

            if (SaveBike(type, condition, status, stationId)) {
                MessageBox.Show("Bike added successfully!", "Success", MessageBoxButton.OK, MessageBoxImage.Information);
                ClearFields();
            } else {
                MessageBox.Show("Failed to add bike.", "Error", MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }

        private bool StationExists(int stationId) {
            try {
                using (var connection = new SQLiteConnection(connectionStr)) {
                    connection.Open();
                    using (var pragma = new SQLiteCommand("PRAGMA foreign_keys = ON;", connection)) {
                        pragma.ExecuteNonQuery();
                    }

                    string query = "SELECT COUNT(1) FROM Stations WHERE StationID = @StationID";
                    using (var cmd = new SQLiteCommand(query, connection)) {
                        cmd.Parameters.AddWithValue("@StationID", stationId);
                        return Convert.ToInt32(cmd.ExecuteScalar()) > 0;
                    }
                }
            } catch {
                return false;
            }
        }

        private bool SaveBike(string type, string condition, string status, int? stationId) {
            try {
                using (var connection = new SQLiteConnection(connectionStr)) {
                    connection.Open();
                    using (var pragma = new SQLiteCommand("PRAGMA foreign_keys = ON;", connection)) {
                        pragma.ExecuteNonQuery();
                    }

                    string query = "INSERT INTO Bikes (Type, [Condition], Status, StationID) VALUES (@Type, @Condition, @Status, @StationID)";
                    using (var cmd = new SQLiteCommand(query, connection)) {
                        cmd.Parameters.AddWithValue("@Type", type);
                        cmd.Parameters.AddWithValue("@Condition", condition);
                        cmd.Parameters.AddWithValue("@Status", status);
                        cmd.Parameters.AddWithValue("@StationID", stationId.HasValue ? (object)stationId.Value : DBNull.Value);

                        return cmd.ExecuteNonQuery() > 0;
                    }
                }
            } catch (Exception ex) {
                MessageBox.Show($"Error saving bike: {ex.Message}", "Error", MessageBoxButton.OK, MessageBoxImage.Error);
                return false;
            }
        }

        private void ClearFields() {
            txtBikeType.Clear();
            txtCondition.Clear();
            cmbStatus.SelectedIndex = 0;
            txtStationID.Clear();
        }
    }
}