from telegram import Update, ReplyKeyboardMarkup
from telegram.ext import Updater, CommandHandler, MessageHandler, Filters,
ConversationHandler, CallbackContext
# Bot Token from BotFather
TOKEN = "1771845EQE-ROCAT5AD0VuUPLQ9RDV78RF6xHkj4"
# State definitions for ConversationHandler
REGISTER, RIDE_DETAILS, MATCH_RIDE = range(3)
# User storage
users = {}
# Start Command
def start(update: Update, context: CallbackContext):
    update.message.reply_text(
        "Welcome to the Carpool Bot!\n"
        "Please use /register to get started or /find to find a ride."
    )
# Registration Command
def register(update: Update, context: CallbackContext):
    update.message.reply_text(
        "Are you a Driver or a Passenger? (Reply with 'Driver' or 'Passenger')"
    )
    return REGISTER
# Save User Type
def save_user_type(update: Update, context: CallbackContext):
    user_type = update.message.text.lower()
    if user_type in ['driver', 'passenger']:
         user_id = update.message.from_user.id
         users[user_id] = {"type": user_type, "rides": []}
         update.message.reply_text(
             f"Registration successful as a {user_type.capitalize()}!\n"
             "Now please enter your trip details (e.g., 'Origin, Destination, Date,
Time')."
         )
         return RIDE_DETAILS
    else:
         update.message.reply_text("Invalid response. Please reply with 'Driver' or
'Passenger'.")
         return REGISTER
# Collect Trip Details
def ride_details(update: Update, context: CallbackContext):
    ride_info = update.message.text
    user_id = update.message.from_user.id
    if user_id in users:
        users[user_id]["rides"].append(ride_info)
        update.message.reply_text(
            "Your ride details have been saved!\n"
            "Use /find to find matching rides."
        )
        return ConversationHandler.END
    else:
        update.message.reply_text("You need to register first using /register.")
        return ConversationHandler.END
# Find Matching Rides
def find_ride(update: Update, context: CallbackContext):
    user_id = update.message.from_user.id
    if user_id not in users:
        update.message.reply_text("You need to register first using /register.")
        return ConversationHandler.END
    user_type = users[user_id]["type"]
    matches = []
    # Find rides with opposite type
    for uid, user_data in users.items():
        if uid != user_id and user_data["type"] != user_type:
            matches.extend(user_data["rides"])
    if matches:
        update.message.reply_text(
            "Here are the available rides:\n" + "\n".join(matches)
        )
    else:
        update.message.reply_text("No matching rides found at the moment.")
# Cancel Command
def cancel(update: Update, context: CallbackContext):
    update.message.reply_text("Operation cancelled.")
    return ConversationHandler.END
# Main Function to Set Up the Bot
def main():
    updater = Updater(TOKEN, use_context=True)
    dispatcher = updater.dispatcher
    # Conversation handler for registration and ride details
    conv_handler = ConversationHandler(
        entry_points=[CommandHandler('register', register)],
        states={
            REGISTER: [MessageHandler(Filters.text & ~Filters.command,
save_user_type)],
            RIDE_DETAILS: [MessageHandler(Filters.text & ~Filters.command,
ride_details)],
        },
        fallbacks=[CommandHandler('cancel', cancel)],
    )
    # Handlers
    dispatcher.add_handler(CommandHandler("start", start))
    dispatcher.add_handler(conv_handler)
    dispatcher.add_handler(CommandHandler("find", find_ride))
    # Start the Bot
    updater.start_polling()
    updater.idle()
if __name__ == '__main__':
    main()