<?php

namespace JinDouYun\Model\Common;

/**
 * demo:
 * $zip = new Zip();
 *
 * 压缩单个文件  $zip->zipFiles('app.zip','index.html');
 *
 * 多文件压缩    $zip->zipFiles('app.zip','index.html');
 *
 * 解压缩       $zip->unzipFile('app.zip','app');
 *
 * 解压缩文件
 * Class Zip
 * @package JinDouYun\Model\Common
 */
class Zip
{
    /**
     * 压缩单个文件
     * @method zip_file
     * @param string $filename 文件名
     * @param string $zipName 压缩文件包名
     * @return boolean             true|false
     */
    function zipFile(string $filename, string $zipName = '')
    {
        if (!is_file($filename)) {
            return false;
        }
        $zip = new \ZipArchive();
        $zipName = empty($zipName) ? basename($filename) . '.zip' : $zipName;
        //打开指定压缩包，不存在则创建，存在则覆盖
        if ($zip->open($zipName, \ZipArchive::CREATE | \ZipArchive::OVERWRITE)) {
            //将文件添加到压缩包中
            if ($zip->addFile($filename)) {
                $zip->close();
                //@unlink($filename);
                return true;
            } else {
                return false;
            }
        } else {
            return false;
        }
    }

    /**
     * 多文件压缩
     * @method zip_files
     * @param string $zipName 压缩包的名称，.zip结尾
     * @param string $files 需要压缩文件名，可以是多个
     * @return boolean             true|false
     */
    function zipFiles(string $zipName, ...$files)
    {
        //检测压缩包名称是否正确
        $zipExt = strtolower(pathinfo($zipName, PATHINFO_EXTENSION));
        if ('zip' !== $zipExt) {
            return false;
        }
        $zip = new \ZipArchive();
        if ($zip->open($zipName, \ZipArchive::CREATE | \ZipArchive::OVERWRITE)) {
            foreach ($files as $file) {
                if (is_file($file)) {
                    $zip->addFile($file);
                }
            }
            $zip->close();
            return true;
        } else {
            return false;
        }
    }

    /**
     * 解压缩
     * @method unzip_file
     * @param string $zipName 压缩包名称
     * @param string $dest 解压到指定目录
     * @return boolean              true|false
     */
    function unzipFile(string $zipName, string $dest)
    {
        //检测要解压压缩包是否存在
        if (!is_file($zipName)) {
            return false;
        }
        //检测目标路径是否存在
        if (!is_dir($dest)) {
            mkdir($dest, 0777, true);
        }
        $zip = new \ZipArchive();
        if ($zip->open($zipName)) {
            $zip->extractTo($dest);
            $zip->close();
            return true;
        } else {
            return false;
        }
    }
}