<?php

namespace Kylin\Admin\Traits;

use Kylin\Admin\Admin;
use Kylin\Admin\Form\Field\File;
use Kylin\Admin\Support\Helper;
use Kylin\Admin\Support\WebUploader;
use Illuminate\Filesystem\FilesystemAdapter;
use Illuminate\Support\Facades\Storage;

trait HasUploadedFile
{
    /**
     * 获取文件上传管理.
     *
     * @return WebUploader
     */
    public function uploader()
    {
        return app('admin.web-uploader');
    }

    /**
     * 获取上传文件.
     *
     * @return \Symfony\Component\HttpFoundation\File\UploadedFile|void
     */
    public function file()
    {
        return $this->uploader()->getUploadedFile();
    }

    /**
     * 获取文件管理仓库.
     *
     * @param string|null $disk
     * @return \Illuminate\Contracts\Filesystem\Filesystem|FilesystemAdapter
     */
    public function disk(?string $disk = null)
    {
        return Storage::disk($disk ?: config('admin.upload.disk'));
    }

    /**
     * 判断是否是删除请求.
     *
     * @return bool
     */
    public function isDeleteRequest()
    {
        return request()->has(File::FILE_DELETE_FLAG);
    }

    /**
     * 删除文件.
     *
     * @param \Illuminate\Contracts\Filesystem\Filesystem|FilesystemAdapter $disk
     * @param string|null $path
     * @return bool
     */
    public function deleteFile($disk = null, $path = null)
    {
        $disk = $disk ?: $this->disk();

        return $disk->delete($path ?: request()->key);
    }

    /**
     * 删除文件并响应返回值.
     *
     * @param \Illuminate\Contracts\Filesystem\Filesystem|FilesystemAdapter $disk
     * @param string|null
     * @return \Illuminate\Http\JsonResponse
     */
    public function deleteFileAndResponse($disk = null, $path = null)
    {
        $this->deleteFile($disk, $path);

        return $this->responseDeleted();
    }

    /**
     * 响应上传成功信息.
     *
     * @param string $path 文件完整路径
     * @param string $url
     * @return mixed
     */
    public function responseUploaded(string $path, string $url)
    {
        return Admin::json([
            'id' => $path,
            'name' => Helper::basename($path),
            'path' => Helper::basename($path),
            'url' => $url,
        ]);
    }

    /**
     * 响应验证失败信息.
     *
     * @param mixed $message
     * @return mixed
     */
    public function responseValidationMessage($message)
    {
        return $this->responseErrorMessage($message);
    }

    /**
     * 响应失败信息.
     *
     * @param $error
     * @param $code
     * @return mixed
     */
    public function responseErrorMessage($error)
    {
        return Admin::json()->error($error);
    }

    /**
     * 文件删除成功.
     *
     * @return mixed
     */
    public function responseDeleted()
    {
        return Admin::json();
    }

    /**
     * 文件删除失败.
     *
     * @param string $message
     * @return \Illuminate\Http\JsonResponse
     */
    public function responseDeleteFailed($message = '')
    {
        return $this->responseErrorMessage($message);
    }
}
