<?php
/**
 * Model Pedido
 * Localização: /app/models/Pedido.php
 */
require_once APP_PATH . '/core/Model.php';

class Pedido extends Model
{
    protected string $table = 'pedidos';

    /** Cria pedido + itens em transação */
    public function criarComItens(array $dadosCliente, array $itens): int
    {
        $this->db->beginTransaction();
        try {
            $codigo = gerar_codigo_pedido();
            $totalItens = 0;
            $totalProd = 0;

            foreach ($itens as $it) {
                $totalItens += (int)$it['quantidade'];
                if (!empty($it['preco_unitario'])) {
                    $totalProd += $it['preco_unitario'] * $it['quantidade'];
                }
            }

            $dados = array_merge($dadosCliente, [
                'codigo'         => $codigo,
                'total_itens'    => $totalItens,
                'total_produtos' => $totalProd ?: null,
                'status'         => 'novo',
                'ip_cliente'     => $_SERVER['REMOTE_ADDR'] ?? null,
                'user_agent'     => substr($_SERVER['HTTP_USER_AGENT'] ?? '', 0, 255),
            ]);

            $pedido_id = $this->create($dados);

            $stmt = $this->db->prepare(
                "INSERT INTO pedido_itens
                 (pedido_id, produto_id, variacao_id, produto_nome, produto_sku,
                  variacao_descricao, quantidade, preco_unitario, subtotal)
                 VALUES (:pid, :prod, :var, :nome, :sku, :vdesc, :qtd, :pu, :sub)"
            );
            foreach ($itens as $it) {
                $sub = !empty($it['preco_unitario']) ? $it['preco_unitario'] * $it['quantidade'] : null;
                $stmt->execute([
                    ':pid'   => $pedido_id,
                    ':prod'  => $it['produto_id'] ?? null,
                    ':var'   => $it['variacao_id'] ?? null,
                    ':nome'  => $it['produto_nome'],
                    ':sku'   => $it['produto_sku'],
                    ':vdesc' => $it['variacao_descricao'] ?? null,
                    ':qtd'   => $it['quantidade'],
                    ':pu'    => $it['preco_unitario'] ?? null,
                    ':sub'   => $sub,
                ]);
            }

            $this->db->commit();
            return $pedido_id;
        } catch (Exception $e) {
            $this->db->rollBack();
            throw $e;
        }
    }

    public function listarAdmin(array $f = [], int $page = 1, int $perPage = 20): array
    {
        $where = ['1=1'];
        $params = [];

        if (!empty($f['status'])) {
            $where[] = "status = :s";
            $params[':s'] = $f['status'];
        }
        if (!empty($f['busca'])) {
            $where[] = "(codigo LIKE :b OR cliente_nome LIKE :b OR cliente_email LIKE :b)";
            $params[':b'] = '%' . $f['busca'] . '%';
        }

        $whereSql = 'WHERE ' . implode(' AND ', $where);

        $stmt = $this->db->prepare("SELECT COUNT(*) t FROM pedidos {$whereSql}");
        $stmt->execute($params);
        $total = (int)$stmt->fetch()['t'];

        $offset = ($page - 1) * $perPage;
        $sql = "SELECT * FROM pedidos {$whereSql} ORDER BY created_at DESC LIMIT :l OFFSET :o";
        $stmt = $this->db->prepare($sql);
        foreach ($params as $k => $v) $stmt->bindValue($k, $v);
        $stmt->bindValue(':l', $perPage, PDO::PARAM_INT);
        $stmt->bindValue(':o', $offset, PDO::PARAM_INT);
        $stmt->execute();

        return [
            'items' => $stmt->fetchAll(),
            'total' => $total,
            'pages' => (int)ceil($total / $perPage),
            'page'  => $page
        ];
    }

    public function itens(int $pedido_id): array
    {
        $stmt = $this->db->prepare(
            "SELECT pi.*, (SELECT arquivo FROM produto_imagens WHERE produto_id = pi.produto_id
                ORDER BY principal DESC LIMIT 1) AS imagem
             FROM pedido_itens pi WHERE pi.pedido_id = :p"
        );
        $stmt->execute([':p' => $pedido_id]);
        return $stmt->fetchAll();
    }

    public function atualizarStatus(int $id, string $status): bool
    {
        return $this->update($id, ['status' => $status]);
    }

    public function dashboardMetricas(): array
    {
        $db = $this->db;
        $total = (int)$db->query("SELECT COUNT(*) t FROM pedidos")->fetch()['t'];
        $novos = (int)$db->query("SELECT COUNT(*) t FROM pedidos WHERE status='novo'")->fetch()['t'];
        $mes   = (int)$db->query("SELECT COUNT(*) t FROM pedidos WHERE MONTH(created_at)=MONTH(CURDATE()) AND YEAR(created_at)=YEAR(CURDATE())")->fetch()['t'];
        $prod  = (int)$db->query("SELECT COUNT(*) t FROM produtos WHERE ativo=1")->fetch()['t'];

        $ultimos = $db->query("SELECT * FROM pedidos ORDER BY created_at DESC LIMIT 5")->fetchAll();
        return compact('total','novos','mes','prod','ultimos');
    }
}
