<?php
namespace Modules\Autopecas\Controllers;

use Gestoreasy\Core\Http\Request;
use Gestoreasy\Core\Http\Response;
use Gestoreasy\Core\Tenant\ConnectionManager;
use Gestoreasy\Core\Audit\AuditLogger;
use Gestoreasy\Core\View\View;
use PDO;
use Exception;

class AutopecasController {
    private PDO $pdo;
    
    public function __construct() {
        $this->pdo = ConnectionManager::forTenant();
    }
    
    // ==== Views ====
    public function viewIndex(Request $r): Response {
        return View::renderWithLayout('autopecas/index', ['title' => 'Peças Automotivas']);
    }
    
    public function viewCreate(Request $r): Response {
        return View::renderWithLayout('autopecas/create', ['title' => 'Nova Peça Automotiva']);
    }
    
    public function viewShow(Request $r): Response {
        $id = $r->params['id'] ?? 0;
        return View::renderWithLayout('autopecas/show', ['title' => 'Detalhes da Peça', 'id' => $id]);
    }
    
    public function viewEdit(Request $r): Response {
        $id = $r->params['id'] ?? 0;
        return View::renderWithLayout('autopecas/edit', ['title' => 'Editar Peça', 'id' => $id]);
    }
    
    // ==== API - Peças ====
    public function listPecas(Request $r): Response {
        try {
            $page = max(1, (int)($r->query['page'] ?? 1));
            $perPage = min(100, max(1, (int)($r->query['per_page'] ?? 20)));
            $offset = ($page - 1) * $perPage;
            
            $where = [];
            $params = [];
            
            // Filtros
            if (!empty($r->query['busca'])) {
                $where[] = '(codigo LIKE ? OR descricao LIKE ? OR marca LIKE ? OR fabricante LIKE ?)';
                $like = '%' . $r->query['busca'] . '%';
                $params[] = $like;
                $params[] = $like;
                $params[] = $like;
                $params[] = $like;
            }
            
            if (!empty($r->query['marca'])) {
                $where[] = 'marca = ?';
                $params[] = $r->query['marca'];
            }
            
            if (!empty($r->query['fabricante'])) {
                $where[] = 'fabricante = ?';
                $params[] = $r->query['fabricante'];
            }
            
            if (!empty($r->query['categoria'])) {
                $where[] = 'categoria = ?';
                $params[] = $r->query['categoria'];
            }
            
            if (isset($r->query['ativo'])) {
                $where[] = 'ativo = ?';
                $params[] = (int)$r->query['ativo'];
            }
            
            $whereSql = !empty($where) ? 'WHERE ' . implode(' AND ', $where) : '';
            
            // Contar total
            $countStmt = $this->pdo->prepare("SELECT COUNT(*) FROM autopecas_pecas $whereSql");
            $countStmt->execute($params);
            $total = (int)$countStmt->fetchColumn();
            
            // Buscar peças
            $stmt = $this->pdo->prepare("
                SELECT * FROM autopecas_pecas 
                $whereSql 
                ORDER BY descricao ASC 
                LIMIT $perPage OFFSET $offset
            ");
            $stmt->execute($params);
            $pecas = $stmt->fetchAll(PDO::FETCH_ASSOC);
            
            return Response::json([
                'data' => $pecas,
                'pagination' => [
                    'page' => $page,
                    'per_page' => $perPage,
                    'total' => $total,
                    'pages' => (int)ceil($total / $perPage)
                ]
            ]);
        } catch (Exception $e) {
            return Response::json(['error' => $e->getMessage()], 500);
        }
    }
    
    public function getPeca(Request $r): Response {
        try {
            $id = (int)($r->params['id'] ?? 0);
            if ($id <= 0) {
                return Response::json(['error' => 'ID inválido'], 400);
            }
            
            $stmt = $this->pdo->prepare("SELECT * FROM autopecas_pecas WHERE id = ?");
            $stmt->execute([$id]);
            $peca = $stmt->fetch(PDO::FETCH_ASSOC);
            
            if (!$peca) {
                return Response::json(['error' => 'Peça não encontrada'], 404);
            }
            
            // Buscar compatibilidade
            $compStmt = $this->pdo->prepare("
                SELECT * FROM autopecas_compatibilidade 
                WHERE peca_id = ? 
                ORDER BY marca_veiculo, modelo_veiculo, ano_inicio
            ");
            $compStmt->execute([$id]);
            $peca['compatibilidade'] = $compStmt->fetchAll(PDO::FETCH_ASSOC);
            
            return Response::json(['data' => $peca]);
        } catch (Exception $e) {
            return Response::json(['error' => $e->getMessage()], 500);
        }
    }
    
    public function createPeca(Request $r): Response {
        try {
            $data = $r->body;
            
            $stmt = $this->pdo->prepare("
                INSERT INTO autopecas_pecas (
                    product_id, codigo, descricao, marca, fabricante, categoria, ncm, cest,
                    preco_custo, preco_venda, estoque, estoque_minimo, unidade,
                    observacoes, ativo
                ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
            ");
            
            $stmt->execute([
                $data['product_id'] ?? null,
                $data['codigo'] ?? '',
                $data['descricao'] ?? '',
                $data['marca'] ?? null,
                $data['fabricante'] ?? null,
                $data['categoria'] ?? null,
                $data['ncm'] ?? null,
                $data['cest'] ?? null,
                (float)($data['preco_custo'] ?? 0),
                (float)($data['preco_venda'] ?? 0),
                (float)($data['estoque'] ?? 0),
                (float)($data['estoque_minimo'] ?? 0),
                $data['unidade'] ?? 'UN',
                $data['observacoes'] ?? null,
                (int)($data['ativo'] ?? 1)
            ]);
            
            $id = (int)$this->pdo->lastInsertId();
            AuditLogger::logCreate('autopecas_pecas', $id, $data);
            
            return Response::json(['data' => ['id' => $id]], 201);
        } catch (Exception $e) {
            return Response::json(['error' => $e->getMessage()], 500);
        }
    }
    
    public function updatePeca(Request $r): Response {
        try {
            $id = (int)($r->params['id'] ?? 0);
            if ($id <= 0) {
                return Response::json(['error' => 'ID inválido'], 400);
            }
            
            $data = $r->body;
            
            $stmt = $this->pdo->prepare("
                UPDATE autopecas_pecas SET
                    product_id = COALESCE(?, product_id),
                    codigo = COALESCE(?, codigo),
                    descricao = COALESCE(?, descricao),
                    marca = COALESCE(?, marca),
                    fabricante = COALESCE(?, fabricante),
                    categoria = COALESCE(?, categoria),
                    ncm = COALESCE(?, ncm),
                    cest = COALESCE(?, cest),
                    preco_custo = COALESCE(?, preco_custo),
                    preco_venda = COALESCE(?, preco_venda),
                    estoque = COALESCE(?, estoque),
                    estoque_minimo = COALESCE(?, estoque_minimo),
                    unidade = COALESCE(?, unidade),
                    observacoes = COALESCE(?, observacoes),
                    ativo = COALESCE(?, ativo),
                    updated_at = CURRENT_TIMESTAMP
                WHERE id = ?
            ");
            
            $stmt->execute([
                $data['product_id'] ?? null,
                $data['codigo'] ?? null,
                $data['descricao'] ?? null,
                $data['marca'] ?? null,
                $data['fabricante'] ?? null,
                $data['categoria'] ?? null,
                $data['ncm'] ?? null,
                $data['cest'] ?? null,
                isset($data['preco_custo']) ? (float)$data['preco_custo'] : null,
                isset($data['preco_venda']) ? (float)$data['preco_venda'] : null,
                isset($data['estoque']) ? (float)$data['estoque'] : null,
                isset($data['estoque_minimo']) ? (float)$data['estoque_minimo'] : null,
                $data['unidade'] ?? null,
                $data['observacoes'] ?? null,
                isset($data['ativo']) ? (int)$data['ativo'] : null,
                $id
            ]);
            
            AuditLogger::logUpdate('autopecas_pecas', $id, [], $data);
            
            return Response::json(['data' => ['id' => $id, 'updated' => true]]);
        } catch (Exception $e) {
            return Response::json(['error' => $e->getMessage()], 500);
        }
    }
    
    public function deletePeca(Request $r): Response {
        try {
            $id = (int)($r->params['id'] ?? 0);
            if ($id <= 0) {
                return Response::json(['error' => 'ID inválido'], 400);
            }
            
            $stmt = $this->pdo->prepare("DELETE FROM autopecas_pecas WHERE id = ?");
            $stmt->execute([$id]);
            
            if ($stmt->rowCount() === 0) {
                return Response::json(['error' => 'Peça não encontrada'], 404);
            }
            
            AuditLogger::logDelete('autopecas_pecas', $id);
            
            return Response::json(['data' => ['id' => $id, 'deleted' => true]]);
        } catch (Exception $e) {
            return Response::json(['error' => $e->getMessage()], 500);
        }
    }
    
    public function getCompatibilidade(Request $r): Response {
        try {
            $id = (int)($r->params['id'] ?? 0);
            if ($id <= 0) {
                return Response::json(['error' => 'ID inválido'], 400);
            }
            
            $stmt = $this->pdo->prepare("
                SELECT * FROM autopecas_compatibilidade 
                WHERE peca_id = ? 
                ORDER BY marca_veiculo, modelo_veiculo, ano_inicio
            ");
            $stmt->execute([$id]);
            $compatibilidade = $stmt->fetchAll(PDO::FETCH_ASSOC);
            
            return Response::json(['data' => $compatibilidade]);
        } catch (Exception $e) {
            return Response::json(['error' => $e->getMessage()], 500);
        }
    }
    
    public function addCompatibilidade(Request $r): Response {
        try {
            $id = (int)($r->params['id'] ?? 0);
            if ($id <= 0) {
                return Response::json(['error' => 'ID inválido'], 400);
            }
            
            $data = $r->body;
            
            $stmt = $this->pdo->prepare("
                INSERT INTO autopecas_compatibilidade (
                    peca_id, marca_veiculo, modelo_veiculo, versao, ano_inicio, ano_fim, motor, observacoes
                ) VALUES (?, ?, ?, ?, ?, ?, ?, ?)
            ");
            
            $stmt->execute([
                $id,
                $data['marca_veiculo'] ?? '',
                $data['modelo_veiculo'] ?? '',
                $data['versao'] ?? null,
                !empty($data['ano_inicio']) ? (int)$data['ano_inicio'] : null,
                !empty($data['ano_fim']) ? (int)$data['ano_fim'] : null,
                $data['motor'] ?? null,
                $data['observacoes'] ?? null
            ]);
            
            $compatId = (int)$this->pdo->lastInsertId();
            
            return Response::json(['data' => ['id' => $compatId]], 201);
        } catch (Exception $e) {
            return Response::json(['error' => $e->getMessage()], 500);
        }
    }
    
    public function removeCompatibilidade(Request $r): Response {
        try {
            $id = (int)($r->params['id'] ?? 0);
            $compatId = (int)($r->params['compatId'] ?? 0);
            
            if ($id <= 0 || $compatId <= 0) {
                return Response::json(['error' => 'ID inválido'], 400);
            }
            
            $stmt = $this->pdo->prepare("
                DELETE FROM autopecas_compatibilidade 
                WHERE id = ? AND peca_id = ?
            ");
            $stmt->execute([$compatId, $id]);
            
            if ($stmt->rowCount() === 0) {
                return Response::json(['error' => 'Compatibilidade não encontrada'], 404);
            }
            
            return Response::json(['data' => ['id' => $compatId, 'deleted' => true]]);
        } catch (Exception $e) {
            return Response::json(['error' => $e->getMessage()], 500);
        }
    }
    
    public function buscarPorModelo(Request $r): Response {
        try {
            $marca = $r->query['marca'] ?? '';
            $modelo = $r->query['modelo'] ?? '';
            $ano = !empty($r->query['ano']) ? (int)$r->query['ano'] : null;
            $versao = $r->query['versao'] ?? '';
            $motor = $r->query['motor'] ?? '';
            
            $where = ['c.peca_id = p.id', 'p.ativo = 1'];
            $params = [];
            
            if (!empty($marca)) {
                $where[] = 'c.marca_veiculo LIKE ?';
                $params[] = "%$marca%";
            }
            
            if (!empty($modelo)) {
                $where[] = 'c.modelo_veiculo LIKE ?';
                $params[] = "%$modelo%";
            }
            
            if (!empty($versao)) {
                $where[] = 'c.versao LIKE ?';
                $params[] = "%$versao%";
            }
            
            if (!empty($motor)) {
                $where[] = 'c.motor LIKE ?';
                $params[] = "%$motor%";
            }
            
            if ($ano !== null) {
                $where[] = '(c.ano_inicio IS NULL OR c.ano_inicio <= ?) AND (c.ano_fim IS NULL OR c.ano_fim >= ?)';
                $params[] = $ano;
                $params[] = $ano;
            }
            
            $whereSql = implode(' AND ', $where);
            
            $stmt = $this->pdo->prepare("
                SELECT DISTINCT p.*, c.marca_veiculo, c.modelo_veiculo, c.versao, c.ano_inicio, c.ano_fim, c.motor
                FROM autopecas_pecas p
                INNER JOIN autopecas_compatibilidade c ON $whereSql
                ORDER BY p.descricao
            ");
            $stmt->execute($params);
            $pecas = $stmt->fetchAll(PDO::FETCH_ASSOC);
            
            return Response::json(['data' => $pecas]);
        } catch (Exception $e) {
            return Response::json(['error' => $e->getMessage()], 500);
        }
    }
}

