<?php
namespace Gestoreasy\Core\Fiscal\Sped\Blocks;

use PDO;
use Gestoreasy\Core\Fiscal\Sped\BlockInterface;
use Gestoreasy\Core\Fiscal\Sped\Period;

class BlockH implements BlockInterface {
    public function id(): string { return 'H'; }

    public function generate(PDO $pdo, Period $period, array $options = []): array {
        $lines = [];

        // Carrega inventário do período a partir de products (estoque atual)
        $items = $this->inventoryItems($pdo);
        $hasMovement = !empty($items);

        // H001 - Abertura do Bloco H (ind_mov: 0=com movimento, 1=sem movimento)
        $lines[] = sprintf('|H001|%d|', $hasMovement ? 0 : 1);

        if ($hasMovement) {
            // H005 - Totais do inventário na data de encerramento do período
            $dt_inv = str_replace('-', '', $period->endDate());
            $vl_inv = 0.0;
            foreach ($items as $it) { $vl_inv += (float)$it['vl_item']; }
            // MOT_INV: 01 = Inventário final do período
            $lines[] = sprintf('|H005|%s|%.2f|%s|', $dt_inv, $vl_inv, '01');

            // H010 - Itens do inventário
            foreach ($items as $it) {
                // |H010|COD_ITEM|UNID|QTD|VL_UNIT|VL_ITEM|IND_PROP|COD_PART|TXT_COMPL|COD_CTA|
                $lines[] = sprintf(
                    '|H010|%s|%s|%.3f|%.2f|%.2f|%s|%s|%s|%s|',
                    (string)$it['cod_item'],
                    (string)$it['unid'],
                    (float)$it['qtd'],
                    (float)$it['vl_unit'],
                    (float)$it['vl_item'],
                    '0', // IND_PROP: 0=próprio
                    '',  // COD_PART: não aplicável
                    '',  // TXT_COMPL
                    ''   // COD_CTA (não mapeado)
                );
            }
        }

        // H990 - Encerramento do Bloco H
        $qtd_lin_h = count($lines) + 1; // +1 para o próprio H990
        $lines[] = sprintf('|H990|%d|', $qtd_lin_h);
        return $lines;
    }

    /**
     * Retorna itens de inventário simplificados a partir de products.
     * Fallback básico: usa estoque atual e preço como custo unitário.
     */
    private function inventoryItems(PDO $pdo): array {
        $out = [];
        try {
            $stmt = $pdo->query('SELECT codigo, unidade, estoque, preco FROM products ORDER BY id ASC');
            while ($row = $stmt->fetch()) {
                $qtd = (float)($row['estoque'] ?? 0);
                if ($qtd <= 0) { continue; }
                $vlUnit = (float)($row['preco'] ?? 0);
                $out[] = [
                    'cod_item' => (string)($row['codigo'] ?? ''),
                    'unid' => (string)($row['unidade'] ?? ''),
                    'qtd' => $qtd,
                    'vl_unit' => $vlUnit,
                    'vl_item' => round($qtd * $vlUnit, 2),
                ];
            }
        } catch (\Throwable $e) { /* tolera ausência de tabela/colunas */ }
        return $out;
    }
}