<?php

namespace App\Wrappers;

use App\API\Models\_DatabaseRecordPermissionSet;
use App\API\Models\EnumeratorDetails;
use App\API\Models\UserDetails;
use App\Configuration;
use Aura\SqlQuery\Common\DeleteInterface;
use Aura\SqlQuery\Common\InsertInterface;
use Aura\SqlQuery\Common\SelectInterface;
use Aura\SqlQuery\Common\UpdateInterface;
use Aura\SqlQuery\QueryFactory;
use PDO;

class DatabaseInteractions
{
    private PDO $pdo;

    public function __construct()
    {
        $servername = Configuration::GetConfig('MariaDB', 'Host');
        $database = Configuration::GetConfig('MariaDB', 'Database');
        $username = Configuration::GetConfig('MariaDB', 'Username');
        $password = Configuration::GetConfig('MariaDB', 'Password');

        $this->pdo = new PDO(
            "mysql:host=$servername;dbname=$database", $username, $password
        );
    }

    public function ScheduleRowForDeletion(string $tableName, string $id)
    {

    }




    public function RunSelect(SelectInterface $queryBuilder): array
    {
        $sth = $this->pdo->prepare($queryBuilder->getStatement());
        $sth->execute($queryBuilder->getBindValues());
        $result = $sth->fetchAll(PDO::FETCH_ASSOC);
        return $result;
    }

    public function RunOneSelect(SelectInterface $queryBuilder): array
    {
        $sth = $this->pdo->prepare($queryBuilder->getStatement());
        $sth->execute($queryBuilder->getBindValues());
        $result = $sth->fetchAll(PDO::FETCH_ASSOC);
        if(sizeof($result) == 1) return $result[0];

        echo "invalid single row db response";
        die();
    }

    public function UpdateSingleField(UpdateInterface $queryBuilder): void
    {
        $sth = $this->pdo->prepare($queryBuilder->getStatement());
        $sth->execute($queryBuilder->getBindValues());
        $result = $sth->fetchAll(PDO::FETCH_ASSOC);
    }

    public function RunInsert(InsertInterface $queryBuilder): bool
    {
        $sth = $this->pdo->prepare($queryBuilder->getStatement());
        return $sth->execute($queryBuilder->getBindValues());
    }
    public function RunUpdate(UpdateInterface $queryBuilder): bool
    {
        $sth = $this->pdo->prepare($queryBuilder->getStatement());
        return $sth->execute($queryBuilder->getBindValues());
    }

    public function RunDelete(DeleteInterface $queryBuilder): bool
    {
        $sth = $this->pdo->prepare($queryBuilder->getStatement());
        return $sth->execute($queryBuilder->getBindValues());
    }
}