/**
 * Abstract base class representing a generic database connection manager.
 * Inspired from https://www.codecademy.com/article/understanding-polymorphism-in-python
 * 
 * @author Hyrum D. Carroll
 * @author Gemini 3.6 Flash
 * @version 1.0
 */
abstract class Database {
    /**
     * Establishes a connection to the underlying database engine.
     * 
     * @return Connection status message.
     */
    public abstract String connect();

    /**
     * Executes an SQL query string against the database.
     * 
     * @param query The SQL query to execute.
     * @return Result summary of the query execution.
     */
    public abstract String executeQuery(String query);
}

/**
 * MySQL-specific database implementation.
 * @author Hyrum D. Carroll
 * @author Gemini 3.6 Flash
 * @version 1.0
 */
class MySQLDatabase extends Database {
    @Override
    public String connect() {
        return "Connected to MySQL";
    }

    @Override
    public String executeQuery(String query) {
        return "Executing in MySQL: " + query;
    }
}

/**
 * PostgreSQL-specific database implementation.
 * @author Hyrum D. Carroll
 * @author Gemini 3.6 Flash
 * @version 1.0
 */
class PostgreSQLDatabase extends Database {
    @Override
    public String connect() {
        return "Connected to PostgreSQL";
    }

    @Override
    public String executeQuery(String query) {
        return "Executing in PostgreSQL: " + query;
    }
}


/**
 * SQLite-specific database implementation.
 * @author Hyrum D. Carroll
 * @version 1.0
 */
class SQLiteDatabase extends Database {
    @Override
    public String connect() {
        return "Connected to SQLite";
    }

    @Override
    public String executeQuery(String query) {
        return "Executing in SQLite: " + query;
    }
}

/**
 * Driver class demonstrating database polymorphism.
 * @author Hyrum D. Carroll
 * @author Gemini 3.6 Flash
 * @version 1.0
 */
public class DatabasePolymorphismExample {
    /**
     * Connects to a database and runs a target query using polymorphism.
     * 
     * @param database The target database instance.
     * @param query    The SQL query to run.
     */
    public static void runQuery(Database database, String query) {
        System.out.println(database.connect());
        System.out.println(database.executeQuery(query));
    }

    /**
     * Main method executing queries across different database types.
     * 
     * @param args Command-line arguments (unused).
     */
    public static void main(String[] args) {
        Database mysql = new MySQLDatabase();
        Database postgres = new PostgreSQLDatabase();
        Database sqlite = new SQLiteDatabase();

        String query = "SELECT * FROM users";

        runQuery(mysql, query);
        System.out.println();

        runQuery(postgres, query);
        System.out.println();

        runQuery(sqlite, query);
    }
}