<?php
/**
 * Provides the file class, an interface to the file table in the database
 * 
 * @author Camil Staps
 * 
 * BusinessAdmin: administrative software for small companies
 * Copyright (C) 2015 Camil Staps (ViviSoft)
 * 
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

/**
 * An interface to the file table in the database
 */
class file {
    /**
     * @var PDO $pdo                The PDO class for database communication
     * @var int $id                 The id of the file
     * @var string $filename        The relative path to the file
     */
    protected $pdo, $id, $filename;

    /**
     * Create a new instance
     * 
     * @param PDO $pdo              The PDO class, to access the database
     * @param int $id               The id of the file to fetch
     * 
     * @throws PDOException         If something went wrong with the database
     * @throws Exception            If the file could not be found
     */
    public function __construct($pdo, $id) {
        $this->pdo = $pdo;

        $stmt = $this->pdo->prepare("SELECT * FROM `".constants::db_prefix."file` WHERE `id`=?");
        $stmt->execute(array($id));
        if ($stmt->rowCount() == 0) {
            throw new Exception("The file with id '$id' could not be found.");
        }
        $file = $stmt->fetch(PDO::FETCH_ASSOC);

        $this->id = $file['id'];
        $this->filename = $file['filename'];
    }

    //------------------------------------------------------------------------------
    // Getters and setters
    //------------------------------------------------------------------------------

    /**
     * Get the ID of the file
     * 
     * @return int                  The ID
     */
    public function getId() {
        return $this->id;
    }

    /**
     * Get the relative filename of the file
     * 
     * @see file::getFilenamePath   To get the full internal path to the file
     * @see file::getFilenameURI    To get the full external path to the file
     * 
     * @return string               The filename
     */
    public function getFilename() {
        return $this->filename;
    }

    /**
     * Get the full internal path to the file
     * 
     * @see file::getFilename       To get the relative filename
     * @see file::getFilenameURI    To get the full external path to the file
     * 
     * @return string               The path
     */
    public function getFilenamePath() {
        return constants::files_folder . $this->filename;
    }

    /**
     * Get the full external path to the file
     * 
     * @see file::getFilename       To get the relative filename
     * @see file::getFilenamePath   To get the full internal path to the file
     * 
     * @return string               The URI
     */
    public function getFilenameURI() {
        return constants::files_folder_external . $this->filename;
    }

    //------------------------------------------------------------------------------
    // Other functions
    //------------------------------------------------------------------------------

    /**
     * Move this file to the trash and delete all records for it
     * 
     * Physically, this moves the file to a trash folder
     * Then, the file will be removed from the file table in the database
     * Any appendices linking to this file with fileId will have fileId NULL
     * Any offers linking to this file with invoice_fileId will have invoice_fileId NULL
     * 
     * @throws PDOException         If there's something wrong with the database
     * 
     * @return bool                 True on success, false on failure
     */
    public function delete() {
        // Try to move the file to trash
        $newname = pathinfo($this->filename, PATHINFO_FILENAME) . '--' . date('Y-m-d.H.i.s.') . pathinfo($this->filename, PATHINFO_EXTENSION);
        $newdir = pathinfo($this->getFilenamePath(), PATHINFO_DIRNAME) . '/' . constants::files_folder_trash . '/';
        if (!file_exists($newdir)) {
            if (!mkdir($newdir)) {
                return false;
            }
        }
        if (!(@rename($this->getFilenamePath(), $newdir . $newname))) {
            return false;
        }

        // Remove offers linked by invoice_fileId
        $this->pdo->query("UPDATE `".constants::db_prefix."offer` SET `invoice_fileId`=NULL WHERE `invoice_fileId`={$this->id}");

        // Remove the record of the file
        $stmt = $this->pdo->prepare("DELETE FROM `".constants::db_prefix."file` WHERE `id`=?");
        $stmt->execute(array($this->id));
        if ($stmt->rowCount() == 1) {
            return true;
        } else {
            return false;
        }
    }
}