<?php

use Kirby\Cms\Api;
use Kirby\Cms\File;
use Kirby\Exception\Exception;

return [
	'props' => [
		/**
		 * Sets the upload options for linked files (since 3.2.0)
		 */
		'uploads' => function ($uploads = []) {
			if ($uploads === false) {
				return false;
			}

			if (is_string($uploads) === true) {
				$uploads = ['template' => $uploads];
			}

			if (is_array($uploads) === false) {
				$uploads = [];
			}

			$template = $uploads['template'] ?? null;

			if ($template) {
				$file = new File([
					'filename' => 'tmp',
					'parent'   => $this->model(),
					'template' => $template
				]);

				$uploads['accept'] = $file->blueprint()->acceptMime();
			} else {
				$uploads['accept'] = '*';
			}

			return $uploads;
		},
	],
	'methods' => [
		'upload' => function (Api $api, $params, Closure $map) {
			if ($params === false) {
				throw new Exception('Uploads are disabled for this field');
			}

			if ($parentQuery = ($params['parent'] ?? null)) {
				$parent = $this->model()->query($parentQuery);
			} else {
				$parent = $this->model();
			}

			if (is_a($parent, 'Kirby\Cms\File') === true) {
				$parent = $parent->parent();
			}

			return $api->upload(function ($source, $filename) use ($parent, $params, $map) {
				$file = $parent->createFile([
					'source'   => $source,
					'template' => $params['template'] ?? null,
					'filename' => $filename,
				]);

				if (is_a($file, 'Kirby\Cms\File') === false) {
					throw new Exception('The file could not be uploaded');
				}

				return $map($file, $parent);
			});
		}
	]
];
