<?php
namespace nur\m\sqlite;

use Exception;
use nur\A;
use nur\m\base\AbstractConn;
use nur\m\base\QueryException;
use SQLite3;

class SqliteConn extends AbstractConn {
  protected $filename, $flags, $encryptionKey;

  protected function beforeInit(?int &$flags, ?string &$encryptionKey): void {
    if ($flags === null) $flags = SQLITE3_OPEN_READWRITE | SQLITE3_OPEN_CREATE;
    if ($encryptionKey === null) $encryptionKey = "";
  }

  protected function afterInit(SQLite3 $conn): void {
    $conn->enableExceptions(true);
  }

  protected $conn;

  function __construct($filename="", ?int $flags=null, ?string $encryptionKey=null) {
    if (is_array($filename)) {
      if ($flags === null) $flags = A::get($filename, "flags");
      if ($encryptionKey === null) $encryptionKey = A::get($filename, "encryption_key");
      $filename = $filename["name"];
    }
    $this->beforeInit($flags, $encryptionKey);
    $this->filename = $filename;
    $this->flags = $flags;
    $this->encryptionKey = $encryptionKey;
    try {
      $conn = new SQLite3($filename, $flags, $encryptionKey);
    } catch (Exception $e) {
      throw new QueryException("unable to open database '$filename'", $e);
    }
    $this->afterInit($conn);
    $this->conn = $conn;
  }

  function __destruct() {
    $this->close();
  }

  function getInfos(): array {
    return [$this->filename, $this->flags, $this->encryptionKey];
  }

  function beginTransaction(): void {
  }

  function commit(): void {
  }

  function rollback(): void {
  }

  function close(): void {
    if ($this->conn !== null) {
      $this->conn->close();
      $this->conn = null;
    }
  }
}