<?php

namespace dokuwiki\File;

use JpegMeta;

class MediaFile
{
    protected $id;
    protected $rev;
    protected $path;

    protected $mime;
    protected $ext;
    protected $downloadable;

    protected $width;
    protected $height;
    protected $meta;

    /**
     * MediaFile constructor.
     * @param string $id
     * @param string|int $rev optional revision
     */
    public function __construct($id, $rev = '')
    {
        $this->id = $id; //FIXME should it be cleaned?
        $this->path = mediaFN($id, $rev);
        $this->rev = $rev;

        [$this->ext, $this->mime, $this->downloadable] = mimetype($this->path, false);
    }

    /** @return string */
    public function getId()
    {
        return $this->id;
    }

    /** @return string|int Empty string for current version */
    public function getRev()
    {
        return $this->rev;
    }

    /** @return string */
    public function getPath()
    {
        return $this->path;
    }

    /**
     * The ID without namespace, used for display purposes
     *
     * @return string
     */
    public function getDisplayName()
    {
        return noNS($this->id);
    }

    /** @return string */
    public function getMime()
    {
        if (!$this->mime) return 'application/octet-stream';
        return $this->mime;
    }

    /** @return string */
    public function getExtension()
    {
        return (string)$this->ext;
    }

    /**
     * Similar to the extesion but does some clean up
     *
     * @return string
     */
    public function getIcoClass()
    {
        $ext = $this->getExtension();
        if ($ext === '') $ext = 'file';
        return preg_replace('/[^_\-a-z0-9]+/i', '_', $ext);
    }

    /**
     * Should this file be downloaded instead being displayed inline?
     *
     * @return bool
     */
    public function isDownloadable()
    {
        return $this->downloadable;
    }

    /** @return int */
    public function getFileSize()
    {
        return filesize($this->path);
    }

    /** @return int */
    public function getLastModified()
    {
        return filemtime($this->path);
    }

    /** @return bool */
    public function isWritable()
    {
        return is_writable($this->path);
    }

    /** @return bool */
    public function isImage()
    {
        return (str_starts_with($this->mime, 'image/'));
    }

    /**
     * initializes width and height for images when requested
     */
    protected function initSizes()
    {
        $this->width = 0;
        $this->height = 0;
        if (!$this->isImage()) return;
        $info = getimagesize($this->path);
        if ($info === false) return;
        [$this->width, $this->height] = $info;
    }

    /**
     * Returns the width if this is a supported image, 0 otherwise
     *
     * @return int
     */
    public function getWidth()
    {
        if ($this->width === null) $this->initSizes();
        return $this->width;
    }

    /**
     * Returns the height if this is a supported image, 0 otherwise
     *
     * @return int
     */
    public function getHeight()
    {
        if ($this->height === null) $this->initSizes();
        return $this->height;
    }

    /**
     * Returns the permissions the current user has on the file
     *
     * @todo doing this for each file within a namespace is a waste, we need to cache this somehow
     * @return int
     */
    public function userPermission()
    {
        return auth_quickaclcheck(getNS($this->id) . ':*');
    }

    /** @return JpegMeta */
    public function getMeta()
    {
        if ($this->meta === null) $this->meta = new JpegMeta($this->path);
        return $this->meta;
    }
}
