/*
========================================================================================
Filename: 36_HallBookingSystem.txt
Program 36: Hall Booking System (Campus Venue Requisition & Collision Detection Project)
Files Included: MainActivity.java, DatabaseHelper.java
========================================================================================

WHAT ALL TO DO / SETUP INSTRUCTIONS:
----------------------------------------------------------------------------------------
1. UI Components to Add (in res/layout/activity_main.xml):
   Add 4 EditText (TextBox):
     - etApplicantName: Hint: 'Applicant / Coordinator Name'
     - etDepartment: Hint: 'Department / Organization'
     - etContactNumber: Hint: 'Contact Phone Number', inputType: 'phone'
     - etSelectedDate: Hint: 'Select Date', focusable: 'false', clickable: 'true'
   Add 2 Spinner widgets:
     - spinnerHall: Venue selection (Main Auditorium, Chavara Hall, etc.)
     - spinnerSlot: Time slot selection (Morning, Afternoon, Full Day)
   Add 2 Button:
     - btnBookHall: Text: 'Submit Requisition', onClick: 'bookHallSlot'
     - btnViewBookings: Text: 'View All Bookings', onClick: 'viewAllBookings'
   Add 2 TextView:
     - Title: 'Hall Booking System'
     - tvStatusDisplay: For displaying booking ledger and status updates

2. Layout Configuration:
   - ScrollView containing vertical LinearLayout (padding 20dp)

3. Menu Configuration:
   - None required (or optional options menu for Logout/Filter).

4. Themes Configuration (res/values/themes.xml):
   - Theme.MaterialComponents.DayNight.NoActionBar in res/values/themes.xml.

5. AndroidManifest.xml:
   <activity android:name=".MainActivity" android:exported="true" />

6. Additional Files & Resources Required:
   - Create DatabaseHelper.java extending SQLiteOpenHelper (with tables for halls and bookings, collision detection method isSlotBooked(hall, date, slot), and insertBooking).
========================================================================================
*/

// ======================================================================================
// File: MainActivity.java
// ======================================================================================
package com.example.hallbookingsystem;
import android.app.DatePickerDialog;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import java.util.Calendar;
public class MainActivity extends AppCompatActivity {
    private EditText etApplicantName, etDepartment, etContactNumber, etSelectedDate;
    private Spinner spinnerHall, spinnerSlot;
    private Button btnBookHall, btnViewBookings;
    private TextView tvStatusDisplay;
    private DatabaseHelper dbHelper;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        etApplicantName = findViewById(R.id.etApplicantName);
        etDepartment = findViewById(R.id.etDepartment);
        etContactNumber = findViewById(R.id.etContactNumber);
        etSelectedDate = findViewById(R.id.etSelectedDate);
        spinnerHall = findViewById(R.id.spinnerHall);
        spinnerSlot = findViewById(R.id.spinnerSlot);
        btnBookHall = findViewById(R.id.btnBookHall);
        btnViewBookings = findViewById(R.id.btnViewBookings);
        tvStatusDisplay = findViewById(R.id.tvStatusDisplay);
        dbHelper = new DatabaseHelper(this);
        String[] halls = {
                "Main Auditorium (Cap: 800)",
                "Chavara Hall (Cap: 300)",
                "Conference Hall A (Cap: 100)",
                "Seminar Hall B (Cap: 150)"
        };
        ArrayAdapter<String> hallAdapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_dropdown_item, halls);
        spinnerHall.setAdapter(hallAdapter);
        String[] slots = {
                "Morning (09:00 AM - 01:00 PM)",
                "Afternoon (01:30 PM - 05:30 PM)",
                "Full Day (09:00 AM - 05:00 PM)"
        };
        ArrayAdapter<String> slotAdapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_dropdown_item, slots);
        spinnerSlot.setAdapter(slotAdapter);
        etSelectedDate.setOnClickListener(v -> showDatePicker());
        btnBookHall.setOnClickListener(v -> bookHallSlot());
        btnViewBookings.setOnClickListener(v -> viewAllBookings());
    }
    private void showDatePicker() {
        Calendar calendar = Calendar.getInstance();
        int year = calendar.get(Calendar.YEAR);
        int month = calendar.get(Calendar.MONTH);
        int day = calendar.get(Calendar.DAY_OF_MONTH);
        DatePickerDialog dialog = new DatePickerDialog(this, (view, y, m, d) -> {
            String date = String.format("%02d/%02d/%04d", d, m + 1, y);
            etSelectedDate.setText(date);
        }, year, month, day);
        dialog.show();
    }
    private void bookHallSlot() {
        String name = etApplicantName.getText().toString().trim();
        String dept = etDepartment.getText().toString().trim();
        String contact = etContactNumber.getText().toString().trim();
        String date = etSelectedDate.getText().toString().trim();
        String hall = spinnerHall.getSelectedItem().toString();
        String slot = spinnerSlot.getSelectedItem().toString();
        if (name.isEmpty() || dept.isEmpty() || contact.isEmpty() || date.isEmpty()) {
            Toast.makeText(this, "Please fill all requisition fields", Toast.LENGTH_SHORT).show();
            return;
        }
        if (dbHelper.isSlotBooked(hall, date, slot)) {
            Toast.makeText(this, "Collision Detected! Slot already reserved.", Toast.LENGTH_LONG).show();
            return;
        }
        boolean success = dbHelper.insertBooking(name, dept, contact, hall, date, slot);
        if (success) {
            Toast.makeText(this, "Booking Requisition Submitted Successfully!", Toast.LENGTH_SHORT).show();
            tvStatusDisplay.setText("Last Request: " + hall + "\nDate: " + date + "\nSlot: " + slot + "\nStatus: Approved");
            etApplicantName.setText("");
            etDepartment.setText("");
            etContactNumber.setText("");
            etSelectedDate.setText("");
        } else {
            Toast.makeText(this, "Failed to submit booking", Toast.LENGTH_SHORT).show();
        }
    }
    private void viewAllBookings() {
        String records = dbHelper.getAllBookings();
        if (records.isEmpty()) {
            tvStatusDisplay.setText("No active venue bookings found.");
        } else {
            tvStatusDisplay.setText(records);
        }
    }
}
// ======================================================================================

// ======================================================================================
// File: DatabaseHelper.java
// ======================================================================================
package com.example.hallbookingsystem;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class DatabaseHelper extends SQLiteOpenHelper {
    private static final String DATABASE_NAME = "HallBooking.db";
    private static final int DATABASE_VERSION = 1;
    private static final String TABLE_BOOKINGS = "bookings";
    public DatabaseHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }
    @Override
    public void onCreate(SQLiteDatabase db) {
        String createTable = "CREATE TABLE " + TABLE_BOOKINGS + " (" +
                "id INTEGER PRIMARY KEY AUTOINCREMENT, " +
                "applicant_name TEXT, " +
                "department TEXT, " +
                "contact_number TEXT, " +
                "hall_name TEXT, " +
                "booking_date TEXT, " +
                "time_slot TEXT)";
        db.execSQL(createTable);
    }
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_BOOKINGS);
        onCreate(db);
    }
    public boolean isSlotBooked(String hall, String date, String slot) {
        SQLiteDatabase db = this.getReadableDatabase();
        Cursor cursor = db.rawQuery(
                "SELECT * FROM " + TABLE_BOOKINGS + " WHERE hall_name = ? AND booking_date = ? AND time_slot = ?",
                new String[]{hall, date, slot}
        );
        boolean booked = cursor.getCount() > 0;
        cursor.close();
        return booked;
    }
    public boolean insertBooking(String name, String dept, String contact, String hall, String date, String slot) {
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put("applicant_name", name);
        values.put("department", dept);
        values.put("contact_number", contact);
        values.put("hall_name", hall);
        values.put("booking_date", date);
        values.put("time_slot", slot);
        long result = db.insert(TABLE_BOOKINGS, null, values);
        return result != -1;
    }
    public String getAllBookings() {
        SQLiteDatabase db = this.getReadableDatabase();
        Cursor cursor = db.rawQuery("SELECT * FROM " + TABLE_BOOKINGS + " ORDER BY id DESC", null);
        StringBuilder builder = new StringBuilder();
        while (cursor.moveToNext()) {
            builder.append("Booking ID: ").append(cursor.getInt(0)).append("\n")
                   .append("Applicant: ").append(cursor.getString(1)).append("\n")
                   .append("Dept: ").append(cursor.getString(2)).append("\n")
                   .append("Contact: ").append(cursor.getString(3)).append("\n")
                   .append("Hall: ").append(cursor.getString(4)).append("\n")
                   .append("Date: ").append(cursor.getString(5)).append("\n")
                   .append("Slot: ").append(cursor.getString(6)).append("\n")
                   .append("------------------------------------\n");
        }
        cursor.close();
        return builder.toString();
    }
}
