<?php
/**
 * ProdutoAdminController - CRUD de produtos no painel
 * Localização: /app/controllers/ProdutoAdminController.php
 */

class ProdutoAdminController extends Controller
{
    public function index(): void
    {
        $this->requireAdmin();
        $produtoModel = $this->model('Produto');
        $categoriaModel = $this->model('Categoria');

        $filtros = [
            'busca'        => $this->input('busca'),
            'ativo'        => $this->input('ativo', ''),
            'categoria_id' => $this->input('categoria_id'),
        ];
        $page = max(1, (int)$this->input('page', 1));
        $resultado = $produtoModel->listarAdmin($filtros, $page, ADMIN_ITEMS_PER_PAGE);

        $this->view('admin/produtos/index', [
            'pageTitle'  => 'Produtos - OFFICE Admin',
            'produtos'   => $resultado['items'],
            'pagination' => $resultado,
            'categorias' => $categoriaModel->all('ordem','ASC'),
            'filtros'    => $filtros,
        ], 'admin');
    }

    public function criar(): void
    {
        $this->requireAdmin();
        $this->view('admin/produtos/form', [
            'pageTitle'  => 'Novo Produto',
            'produto'    => null,
            'imagens'    => [],
            'variacoes'  => [],
            'categorias' => $this->model('Categoria')->all('ordem','ASC'),
            'colecoes'   => $this->model('Colecao')->all('ordem','ASC'),
        ], 'admin');
    }

    public function salvar(): void
    {
        $this->requireAdmin();
        $this->validateCsrf();

        $id = (int)$this->input('id', 0);
        $produtoModel = $this->model('Produto');

        $nome = trim($this->input('nome',''));
        $sku  = trim($this->input('sku',''));
        if (!$nome || !$sku) {
            $this->setFlash('error','Nome e SKU são obrigatórios');
            $this->redirect(admin_url('produtos/' . ($id ? "editar/{$id}" : 'criar')));
            return;
        }

        $slug = slugify($this->input('slug', '') ?: $nome);
        // garante unicidade de slug (ignorando o próprio id)
        $base = $slug; $i = 1;
        while (true) {
            $stmt = Database::getInstance()->prepare("SELECT id FROM produtos WHERE slug = :s AND id <> :i LIMIT 1");
            $stmt->execute([':s'=>$slug, ':i'=>$id]);
            if (!$stmt->fetch()) break;
            $slug = $base . '-' . (++$i);
        }

        $dados = [
            'categoria_id'      => (int)$this->input('categoria_id',0) ?: null,
            'colecao_id'        => (int)$this->input('colecao_id',0) ?: null,
            'nome'              => $nome,
            'slug'              => $slug,
            'sku'               => $sku,
            'descricao_curta'   => trim($this->input('descricao_curta','')) ?: null,
            'descricao_completa'=> trim($this->input('descricao_completa','')) ?: null,
            'material_armacao'  => trim($this->input('material_armacao','')) ?: null,
            'tipo_lente'        => trim($this->input('tipo_lente','')) ?: null,
            'protecao_uv'       => trim($this->input('protecao_uv','')) ?: null,
            'polarizado'        => $this->input('polarizado') ? 1 : 0,
            'medidas'           => trim($this->input('medidas','')) ?: null,
            'preco'             => $this->input('preco') !== '' ? (float)str_replace(',','.',$this->input('preco')) : null,
            'mostrar_preco'     => $this->input('mostrar_preco') ? 1 : 0,
            'destaque'          => $this->input('destaque') ? 1 : 0,
            'ativo'             => $this->input('ativo') ? 1 : 0,
            'ordem'             => (int)$this->input('ordem',0),
            'meta_titulo'       => trim($this->input('meta_titulo','')) ?: null,
            'meta_descricao'    => trim($this->input('meta_descricao','')) ?: null,
        ];

        if ($id) {
            $produtoModel->update($id, $dados);
        } else {
            $id = $produtoModel->create($dados);
        }

        // upload de imagens múltiplas
        if (!empty($_FILES['imagens']['name'][0])) {
            $total = count($_FILES['imagens']['name']);
            $principalSet = (bool) Database::getInstance()->query("SELECT 1 FROM produto_imagens WHERE produto_id = {$id} AND principal = 1 LIMIT 1")->fetch();
            for ($i = 0; $i < $total; $i++) {
                $arq = [
                    'name'     => $_FILES['imagens']['name'][$i],
                    'type'     => $_FILES['imagens']['type'][$i],
                    'tmp_name' => $_FILES['imagens']['tmp_name'][$i],
                    'error'    => $_FILES['imagens']['error'][$i],
                    'size'     => $_FILES['imagens']['size'][$i],
                ];
                $path = upload_imagem($arq, 'produtos');
                if ($path) {
                    $principal = !$principalSet && $i === 0;
                    if ($principal) $principalSet = true;
                    $produtoModel->adicionarImagem($id, $path, $principal, $i);
                }
            }
        }

        $this->setFlash('success','Produto salvo com sucesso');
        $this->redirect(admin_url('produtos/editar/' . $id));
    }

    public function editar(int $id): void
    {
        $this->requireAdmin();
        $produtoModel = $this->model('Produto');
        $produto = $produtoModel->find($id);
        if (!$produto) { $this->redirect(admin_url('produtos')); return; }

        $this->view('admin/produtos/form', [
            'pageTitle'  => 'Editar: ' . $produto['nome'],
            'produto'    => $produto,
            'imagens'    => $produtoModel->imagens($id),
            'variacoes'  => $produtoModel->variacoes($id),
            'categorias' => $this->model('Categoria')->all('ordem','ASC'),
            'colecoes'   => $this->model('Colecao')->all('ordem','ASC'),
        ], 'admin');
    }

    public function excluir(int $id): void
    {
        $this->requireAdmin();
        $this->model('Produto')->delete($id);
        $this->setFlash('success','Produto excluído');
        $this->redirect(admin_url('produtos'));
    }

    public function toggleAtivo(int $id): void
    {
        $this->requireAdmin();
        $this->model('Produto')->toggleAtivo($id);
        $this->redirect(admin_url('produtos'));
    }

    public function toggleDestaque(int $id): void
    {
        $this->requireAdmin();
        $this->model('Produto')->toggleDestaque($id);
        $this->redirect(admin_url('produtos'));
    }

    public function removerImagem(int $img_id): void
    {
        $this->requireAdmin();
        $db = Database::getInstance();
        $stmt = $db->prepare("SELECT produto_id FROM produto_imagens WHERE id = :i");
        $stmt->execute([':i'=>$img_id]);
        $row = $stmt->fetch();
        if ($row) {
            $this->model('Produto')->removerImagem($img_id);
            $this->redirect(admin_url('produtos/editar/' . $row['produto_id']));
            return;
        }
        $this->back();
    }

    public function definirPrincipal(int $img_id): void
    {
        $this->requireAdmin();
        $db = Database::getInstance();
        $stmt = $db->prepare("SELECT produto_id FROM produto_imagens WHERE id = :i");
        $stmt->execute([':i'=>$img_id]);
        $row = $stmt->fetch();
        if ($row) {
            $db->prepare("UPDATE produto_imagens SET principal = 0 WHERE produto_id = :p")->execute([':p'=>$row['produto_id']]);
            $db->prepare("UPDATE produto_imagens SET principal = 1 WHERE id = :i")->execute([':i'=>$img_id]);
            $this->redirect(admin_url('produtos/editar/' . $row['produto_id']));
            return;
        }
        $this->back();
    }

    public function adicionarVariacao(): void
    {
        $this->requireAdmin();
        $this->validateCsrf();
        $produto_id = (int)$this->input('produto_id');
        $dados = [
            'cor'          => trim($this->input('cor','')) ?: null,
            'cor_hex'      => trim($this->input('cor_hex','')) ?: null,
            'cor_lente'    => trim($this->input('cor_lente','')) ?: null,
            'sku_variacao' => trim($this->input('sku_variacao','')) ?: null,
            'estoque'      => (int)$this->input('estoque',0),
            'ativo'        => 1,
            'ordem'        => (int)$this->input('ordem',0),
        ];
        $this->model('Produto')->adicionarVariacao($produto_id, $dados);
        $this->redirect(admin_url('produtos/editar/' . $produto_id));
    }

    public function removerVariacao(int $id): void
    {
        $this->requireAdmin();
        $db = Database::getInstance();
        $stmt = $db->prepare("SELECT produto_id FROM produto_variacoes WHERE id = :i");
        $stmt->execute([':i'=>$id]);
        $row = $stmt->fetch();
        $this->model('Produto')->removerVariacao($id);
        if ($row) $this->redirect(admin_url('produtos/editar/' . $row['produto_id']));
        else $this->back();
    }
}
