<?php

namespace Lucent\Http\Controller;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;
use Lucent\Channel\ChannelService;
use Lucent\File\FileUploadResult;
use Lucent\Query\Query;
use Lucent\Record\RecordService;
use function Lucent\File\loadDisk;
use function Lucent\File\uploadFile;
use function Lucent\Response\fail;
use function Lucent\Response\ok;


class FileController extends Controller
{

    public function __construct(
        private readonly ChannelService $channelService,
        private readonly RecordService  $recordService,
        private readonly Query          $query
    )
    {
    }

    public function download(Request $request)
    {
        $disk = loadDisk();
        return $disk->download($request->input("path"));
    }


    public function upload(Request $request)
    {
        $validator = Validator::make($request->all(), [
            'files.*' => 'required|file|max:100000',
        ]);

        if ($validator->fails()) {
            return fail($validator->errors()->first());
        }
        $schema = $this->channelService->channel->schemas->firstWhere("name", $request->input("schema"));
        $files = $request->file('files');


        $uploadResults = collect($files)->map(fn($file) => uploadFile($schema, $file))->toArray();
        collect($uploadResults)
            ->filter(fn(FileUploadResult $res) => !$res->isDuplicate)
            ->values()
            ->map(function (FileUploadResult $uploadResult) use ($schema) {

                return $this->recordService->create(
                    schemaName: $schema->name,
                    data: [],
                    file: (array)$uploadResult->recordFile,
                    edges: [],
                    status: "published",
                    uploadFromUrl: ""
                );

            })->toArray();


        $graph = $this->query
            ->filter([
                "schema" => $schema->name
            ])
            ->limit(15)
            ->skip(0)
            ->sort("-_sys.updatedAt")
            ->run();

        return ok($graph->records->toArray());
    }
}
