<?php

namespace App\Services;

use App\Contracts\DatabaseDriverInterface;
use App\Contracts\SchemaDiscoveryInterface;

class DatabaseService
{
    protected ?DatabaseDriverInterface $driver = null;

    /**
     * Set the database driver.
     */
    public function setDriver(DatabaseDriverInterface $driver): self
    {
        $this->driver = $driver;
        return $this;
    }

    /**
     * Get the current driver.
     * 
     * @throws \Exception
     */
    public function getDriver(): DatabaseDriverInterface
    {
        if (!$this->driver) {
            throw new \Exception("Database driver not initialized.");
        }
        return $this->driver;
    }

    /**
     * Establish a connection.
     */
    public function connect(array $config): bool
    {
        return $this->getDriver()->connect($config);
    }

    /**
     * Get all databases.
     */
    public function getDatabases(): array
    {
        $driver = $this->getDriver();
        if ($driver instanceof SchemaDiscoveryInterface) {
            return $driver->getDatabases();
        }
        throw new \Exception("Driver does not support schema discovery.");
    }

    /**
     * Get all tables.
     */
    public function getTables(): array
    {
        $driver = $this->getDriver();
        if ($driver instanceof SchemaDiscoveryInterface) {
            return $driver->getTables();
        }
        throw new \Exception("Driver does not support schema discovery.");
    }

    /**
     * Get table schema.
     */
    public function getTableSchema(string $table): array
    {
        $driver = $this->getDriver();
        if ($driver instanceof SchemaDiscoveryInterface) {
            return $driver->getTableSchema($table);
        }
        throw new \Exception("Driver does not support schema discovery.");
    }
}
