<?php

namespace App\Services;

use Illuminate\Support\Str;
use Illuminate\Support\Facades\Storage;

class UploadService
{
    /**
     * @param mixed $attachment
     * @param int $employeeId
     *
     * @return string
     */
    public function processAttachments($attachment, string $destinationPath): string
    {
        $extension = $attachment->getClientOriginalExtension();
        $newFileName = (string) Str::uuid() . '.' . $extension;
        $this->makeDirectory($destinationPath);
        $this->moveFile($attachment, $destinationPath, $newFileName);
        return $newFileName;
    }

    /**
     * @param string $destinationPath
     *
     * @return void
     */
    private function makeDirectory(string $destinationPath): void
    {
        if (!Storage::disk('public')->exists($destinationPath)) {
            Storage::disk('public')->makeDirectory($destinationPath, 0755, true);
        }
    }

    /**
     * @param mixed $file
     * @param string $destinationPath
     * @param string $fileName
     *
     * @return void
     */
    public function moveFile($file, string $destinationPath, string $fileName): void
    {
        $storedPath = $file->storeAs($destinationPath, $fileName, 'public');

        // Set proper file permissions
        $fullPath = storage_path('app/public/' . $storedPath);
        if (file_exists($fullPath)) {
            chmod($fullPath, 0644);
        }
    }

    /**
     * @param string $directory
     * @param array $reference
     * 
     * @return string
     */
    public function generatePublicLink(string $directory, array $reference): string
    {
        return asset('storage/'.$directory. '/' . $reference['id']. '/' .$reference['column']);
    }
}
