<?php

class ZipCsvProcessor {
    private $zipFile;         // Caminho temporário do arquivo ZIP enviado
    private $extractPath;     // Diretório temporário onde o ZIP será extraído
    private $csvFile;         // Caminho do arquivo CSV encontrado dentro do ZIP
    private $data = [];       // Array para armazenar os dados do CSV
    private $nomeBuscaArquivo; // Nome base do arquivo CSV a ser buscado
    private $extension;       // Extensão do arquivo a ser buscado (ex: "csv")

    /**
     * Construtor da classe ZipCsvProcessor
     * @param string $zipFile Caminho do arquivo ZIP enviado
     * @param string $nomeBuscaArquivo Nome base do arquivo a ser buscado no ZIP
     * @param string $extension Extensão do arquivo a ser buscado
     */
    public function __construct($zipFile, $nomeBuscaArquivo, $extension) {

        $this->zipFile = $zipFile;
        $this->extractPath = __DIR__ . '/arquivos/'; // Define o diretório temporário
        $this->nomeBuscaArquivo = $nomeBuscaArquivo;
        $this->extension = $extension;
    }

    /**
     * Método principal que executa o processo completo:
     * 1. Extrai o ZIP
     * 2. Procura pelo arquivo CSV
     * 3. Lê os dados do CSV
     * 4. Retorna os dados
     * 5. Limpa os arquivos temporários
     */
    public function process() {
        if (!$this->extractZip()) {
            die("Falha ao extrair o ZIP.");
        }

        if (!$this->findCsvFile()) {
            die("Nenhum arquivo encontrado com o nome '$this->nomeBuscaArquivo'.");
        }

  


        $this->readCsv();
        return $this->returnData();

    }

    /**
     * Extrai o arquivo ZIP para o diretório temporário
     * @return bool Retorna true se a extração for bem-sucedida, false caso contrário
     */
    private function extractZip() {
        // Criar diretório temporário se não existir
        if (!is_dir($this->extractPath)) {
            mkdir($this->extractPath, 0777, true);
        }

        $zip = new ZipArchive;
        if ($zip->open($this->zipFile) === TRUE) {
            $zip->extractTo($this->extractPath);
            $zip->close();
            return true;
        }
        return false;
    }

    /**
     * Procura dentro do diretório extraído pelo arquivo desejado
     * @return bool Retorna true se encontrar o arquivo, false caso contrário
     */
    private function findCsvFile() {
        foreach (scandir($this->extractPath) as $file) {
            if (strpos($file, $this->nomeBuscaArquivo) === 0 && pathinfo($file, PATHINFO_EXTENSION) === $this->extension) {
                $this->csvFile = $this->extractPath . $file;
                return true;
            }
        }
        return false;
    }

    /**
     * Lê os dados do arquivo CSV e armazena no array $data
     */
    private function readCsv() {
        if (($handle = fopen($this->csvFile, "r")) !== FALSE) {
            $firstLine = true;
            while (($row = fgetcsv($handle, 1000, ";")) !== FALSE) {
                if ($firstLine) {
                    $firstLine = false; // Ignora o cabeçalho
                    continue;
                }
                $this->data[] = $row;
            }
            fclose($handle);
        }
    }

    /**
     * Retorna os dados lidos do CSV
     * @return array Retorna o array contendo os dados do CSV
     */
    public function returnData() {
        return $this->data;
    }

    /**
     * Remove os arquivos extraídos para evitar acúmulo de lixo no servidor
     */
    public function cleanup() {
        array_map('unlink', glob("$this->extractPath/*"));
        rmdir($this->extractPath);
    }
}


/*
// Exemplo de uso: processar o arquivo ZIP enviado via POST
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['zipfile'])) {

    
    $zipProcessor = new ZipCsvProcessor($_FILES['zipfile']['tmp_name'], 'pagamentos-', 'csv');
    $dados = $zipProcessor->process();

    // Exibir os dados em tabela
    echo "<table border='1'>";
    foreach ($dados as $row) {
        echo "<tr>";
        if (!empty($row)) {
            echo "<td>" . htmlspecialchars($row[0]) . "</td>"; // Apenas a primeira coluna
        }
        echo "</tr>";
    }
    echo "</table>";
} else {
    echo "Nenhum arquivo ZIP foi enviado.";
}

*/