<?php
namespace nur\sery\file;

use Iterator;
use nur\sery\os\IOException;
use nur\sery\php\ICloseable;

/**
 * Interface _IFile: méthodes communes entre {@link IReader} et {@link IWriter}
 */
interface _IFile extends Iterator, ICloseable {
  /**
   * @return resource|null retourner la resource associée à ce fichier si cela
   * a du sens
   */
  function getResource();

  /** si ce fichier est basé sur une resource, ajouter un filtre. */
  function appendFilter(string $filterName, ?int $readWrite=null, $params=null): void;

  /** si ce fichier est basé sur une resource, ajouter un filtre. */
  function prependFilter(string $filterName, ?int $readWrite=null, $params=null): void;

  /** si ce fichier est basé sur une resource, spécifier l'encoding. */
  function setEncodingFilter(string $from, string $to): void;

  /** vérifier si la resource est associée à un terminal */
  function isatty(): bool;

  /** obtenir des informations sur le fichier */
  function fstat(): array;

  /** retourner la taille du fichier */
  function getSize(): int;

  /**
   * retourner la position actuelle de lecture/écriture
   *
   * @throws IOException
   */
  function ftell(): int;

  /**
   * modifier la position actuelle de lecture/écriture
   *
   * @return int la position après avoir déplacé le pointeur
   * @throws IOException
   */
  function fseek(int $offset, int $whence=SEEK_SET): int;

  /** comme {@link fseek()} mais retourne self */
  function seek(int $offset, int $whence=SEEK_SET): self;

  /** fermer le fichier si c'est nécessaire */
  function close(bool $close=true): void;
}
