<?php

require APPLICATION_PATH . '/../vendor/autoload.php';

use Aws\Credentials\Credentials;
use Aws\S3\Exception\S3Exception;

class Agro_Aws_S3
{
    private $client = null;
    private static $bucket = AWS_S3_BUCKET;

    public function __construct() {
        $crendentials = new Credentials(
            AWS_S3_ACCESS_KEY_ID,
            AWS_S3_SECRET_ACCESS_KEY
        );

        $this->client = new Aws\S3\S3Client([
            'version' => 'latest',
            'region'  => 'us-west-2',
            'credentials' => $crendentials
        ]);
    }
    /*
    @param $filename Filename without extension
    @param $path Path where file must be upload. If path doesn't exists, created
    */
    public function uploadFile(?string $filename, ?string $path) : string {
        try {
            if (is_array($_FILES) && count($_FILES)>0) {
                foreach ($_FILES as $file) {
                    if (!$file['error']) {
                        $ext = strtolower(substr($file['name'],strpos($file['name'], '.'),strlen($file['name'])));
                        $filename .= count(explode('.', $filename)) > 1 ? '' : $ext;
                        return end(
                            explode(
                                '/',
                                $this->client->putObject(
                                    array(
                                        'Bucket' => self::$bucket,
                                        'Key' => $path ? $path.'/'.$filename : $filename,
                                        'SourceFile' => $file['tmp_name']
                                    )
                                )->get('ObjectURL')
                            )
                        );
                    }
                }
            }
        } catch (Exception $e) {
            echo 'Erro ao fazer upload do arquivo: '. $e->getMessage();
        }
    }

    /*
    */
    
    public function downloadFile(string $filename) : string {
        try {
            $command = 
                $this->client->getCommand(
                    'GetObject',
                    [
                        'Bucket' => self::$bucket,
                        'Key' => $filename,
                    ]
                );
            $request = $this->client->createPresignedRequest($command, '+120 minutes');
            $preSignedUrl = (string)$request->getUri();

            return $preSignedUrl;
        } catch (S3Exception $e) {
            echo 'Erro ao fazer download do arquivo: '. $e->getMessage();
        }
    }

    function listFiles() : array {
        try {
            return $this->client->listObjectsV2(
                array(
                    'Bucket' => self::$bucket
                )
            )['Contents'];
        } catch (Exception $e) {
            echo 'Erro ao listar arquivos: '. $e->getMessage();
        }
    }

    function deleteFile(string $filename) : bool {
        try {
            $return = $this->client->deleteObject(
                    [
                        'Bucket' => self::$bucket,
                        'Key' => $filename
                    ]
                );
            return true;
        } catch (Exception $e) {
            echo 'Erro ao excluir arquivo: '. $e->getMessage();
        }
        return false;
    }

    function existsFile(string $filename, ?string $path) : bool {
        try {
            $return = $this->client->headObject(
                [
                    'Bucket' => self::$bucket,
                    'Key' => $path.'/'.$filename
                ]
            );

            return $return['ContentLength'] ? true : false;
        } catch (S3Exception $e) {
            if (strpos($e->getMessage(), '404 Not Found')>0) {
                return false;
            }
        }
    }
}