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

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

        public AddRental() {
            InitializeComponent();
            LoadRiders();
            LoadAvailableBikes();
            txtRentalDate.Text = DateTime.Now.ToString("yyyy-MM-dd");
        }

        private void LoadRiders() {
            using var connection = new SQLiteConnection(connectionStr);
            connection.Open();
            using var cmd = new SQLiteCommand("SELECT RiderID, Name FROM Riders", connection);
            using var reader = cmd.ExecuteReader();
            while (reader.Read()) {
                cmbRider.Items.Add(new ComboBoxItem { Content = reader["Name"], Tag = reader["RiderID"] });
            }
        }

        private void LoadAvailableBikes() {
            using var connection = new SQLiteConnection(connectionStr);
            connection.Open();
            using var cmd = new SQLiteCommand($"SELECT BikeID, Type FROM Bikes WHERE Status = '{BikeStatus.Available}'", connection);
            using var reader = cmd.ExecuteReader();
            while (reader.Read()) {
                cmbBike.Items.Add(new ComboBoxItem { Content = reader["Type"], Tag = reader["BikeID"] });
            }
        }

        private void AddRental_Click(object sender, RoutedEventArgs e) {
            if (cmbRider.SelectedItem == null || cmbBike.SelectedItem == null) {
                MessageBox.Show("Please select a Rider and a Bike.", "Warning", MessageBoxButton.OK, MessageBoxImage.Warning);
                return;
            }

            int riderId = Convert.ToInt32(((ComboBoxItem)cmbRider.SelectedItem).Tag);
            int bikeId = Convert.ToInt32(((ComboBoxItem)cmbBike.SelectedItem).Tag);
            string rentalDate = txtRentalDate.Text.Trim();
            string returnDate = txtReturnDate.Text.Trim();

            if (string.IsNullOrWhiteSpace(rentalDate)) rentalDate = DateTime.Now.ToString("yyyy-MM-dd");

            if (SaveRental(riderId, bikeId, rentalDate, returnDate)) {
                MessageBox.Show("Rental added successfully!", "Success", MessageBoxButton.OK, MessageBoxImage.Information);
                txtReturnDate.Clear();
                LoadAvailableBikes(); // refresh available bikes
            } else {
                MessageBox.Show("Failed to add rental.", "Error", MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }

        private bool SaveRental(int riderId, int bikeId, string rentalDate, string returnDate) {
            try {
                using var connection = new SQLiteConnection(connectionStr);
                connection.Open();

                using var transaction = connection.BeginTransaction();

                // Insert rental
                string query = "INSERT INTO Rentals (RiderID, BikeID, RentalDate, ReturnDate) VALUES (@RiderID, @BikeID, @RentalDate, @ReturnDate)";
                using var cmd = new SQLiteCommand(query, connection, transaction);
                cmd.Parameters.AddWithValue("@RiderID", riderId);
                cmd.Parameters.AddWithValue("@BikeID", bikeId);
                cmd.Parameters.AddWithValue("@RentalDate", rentalDate);
                cmd.Parameters.AddWithValue("@ReturnDate", string.IsNullOrWhiteSpace(returnDate) ? DBNull.Value : (object)returnDate);
                cmd.ExecuteNonQuery();

                // Update bike status
                string updateBike = "UPDATE Bikes SET Status = 'Rented' WHERE BikeID = @BikeID";
                using var updateCmd = new SQLiteCommand(updateBike, connection, transaction);
                updateCmd.Parameters.AddWithValue("@BikeID", bikeId);
                updateCmd.ExecuteNonQuery();

                transaction.Commit();
                return true;
            } catch (Exception ex) {
                MessageBox.Show($"Error saving rental: {ex.Message}", "Error", MessageBoxButton.OK, MessageBoxImage.Error);
                return false;
            }
        }
    }
}