<?php

namespace App\Services\Sefaz;

use App\Models\Company;
use Illuminate\Support\Carbon;
use Illuminate\Support\Facades\Storage;

/**
 * Organiza os XMLs no disco privado em empresa/ano/mês, o que mantém os
 * diretórios pequenos o bastante para hospedagem compartilhada e facilita
 * a exportação por competência.
 */
class XmlStorage
{
    public function putNota(Company $company, string $chave, string $xml, ?string $dataEmissao = null): string
    {
        $path = $this->path($company, 'notas', $chave, $dataEmissao);

        Storage::disk('xmls')->put($path, $xml);

        return $path;
    }

    public function putEvento(Company $company, string $chave, string $tipo, int $sequencia, string $xml, ?string $data = null): string
    {
        $path = $this->path($company, 'eventos', "{$chave}-{$tipo}-{$sequencia}", $data);

        Storage::disk('xmls')->put($path, $xml);

        return $path;
    }

    /**
     * Arquiva um documento que o parser não reconheceu. Guardar o bruto é o
     * que impede a perda definitiva: o cursor NSU não volta atrás.
     */
    public function putBruto(Company $company, int $nsu, string $xml): string
    {
        $path = sprintf('%d/pendentes/%s/%d.xml', $company->id, now()->format('Y/m'), $nsu);

        Storage::disk('xmls')->put($path, $xml);

        return $path;
    }

    private function path(Company $company, string $bucket, string $nome, ?string $data): string
    {
        $ref = $data ? Carbon::parse($data) : now();

        return sprintf('%d/%s/%s/%s/%s.xml', $company->id, $bucket, $ref->format('Y'), $ref->format('m'), $nome);
    }
}
