<?php

namespace App\Services;

use Aws\S3\S3Client;
use Aws\S3\Exception\S3Exception;
use GuzzleHttp\Exception\ConnectException;
use League\Flysystem\AwsS3V3\AwsS3V3Adapter;
use League\Flysystem\Filesystem;
use League\Flysystem\UnableToRetrieveMetadata;
use League\Flysystem\FilesystemException;
use League\Flysystem\UnableToListContents;
use League\Flysystem\FileAttributes;
use League\Flysystem\UnableToWriteFile;

class FilesystemService
{
    const VERIFY_FILE_NAME = 'cfstest.txt';

    public static function getVerifyCredentials($key, $secret, $region, $bucket, $endpoint)
    {
        $client = new S3Client([
            'version' => 'latest',
            'region' => $region,
            'endpoint' => $endpoint,
            'credentials' => [
                'key' => $key,
                'secret' => $secret,
            ]
        ]);

        $adapter = new AwsS3V3Adapter(
            $client,
            $bucket,
        );

        $throw = false;
        $filesystem = new Filesystem($adapter);

        $writable = false;
        try {
            $filesystem->write(self::VERIFY_FILE_NAME, 'ok', []);
            $writable = true;
        } catch (FilesystemException | UnableToWriteFile $exception) {
            $writable = false;
        }

        if(!$writable) {
            return false;
        }

        try {
            $response = $filesystem->read(self::VERIFY_FILE_NAME);
            if($response === 'ok') {
                $writable = true;
                $res[] = self::VERIFY_FILE_NAME;
            } else {
                $writable = false;
            }
        } catch (FilesystemException | UnableToReadFile $exception) {
            $writable = false;
        }

        if(in_array(self::VERIFY_FILE_NAME, $res)) {
            try {
                $filesystem->delete(self::VERIFY_FILE_NAME);
            } catch (FilesystemException | UnableToDeleteFile $exception) {
                $writable = false;
            }
        }

        if(!$writable) {
            return false;
        }

        if(in_array(self::VERIFY_FILE_NAME, $res)) {
            return true;
        }

        return false;
    }
}