<?php
// upload_tenant_logo.php

// Habilitar exibição de erros para debug (remover em produção)
error_reporting(E_ALL);
ini_set('display_errors', 1);

if (session_status() === PHP_SESSION_NONE) {
    session_start();
}

// Verificar se o usuário está logado e é administrador
if (!isset($_SESSION['logado']) || $_SESSION['logado'] !== true) {
    echo json_encode(['success' => false, 'message' => 'Usuário não logado']);
    exit;
}

// Verificar se é administrador
$permissao = $_SESSION['permissao'] ?? 'usuario';
if (!in_array($permissao, ['admin', 'super_admin'])) {
    echo json_encode(['success' => false, 'message' => 'Apenas administradores podem alterar a logo do tenant']);
    exit;
}

// Verificar se o tenant_id está definido
if (!isset($_SESSION['tenant_id'])) {
    echo json_encode(['success' => false, 'message' => 'Tenant não identificado']);
    exit;
}

$tenant_id = $_SESSION['tenant_id'];
$upload_dir = 'uploads/tenant_logos/';

// Criar diretório se não existir
if (!is_dir($upload_dir)) {
    if (!mkdir($upload_dir, 0755, true)) {
        echo json_encode(['success' => false, 'message' => 'Não foi possível criar o diretório de upload']);
        exit;
    }
}

// Verificar se existe arquivo
if (!isset($_FILES['tenant_logo']) || $_FILES['tenant_logo']['error'] !== UPLOAD_ERR_OK) {
    $error_messages = [
        UPLOAD_ERR_INI_SIZE => 'Arquivo muito grande (limite do servidor)',
        UPLOAD_ERR_FORM_SIZE => 'Arquivo muito grande (limite do formulário)',
        UPLOAD_ERR_PARTIAL => 'Upload parcialmente feito',
        UPLOAD_ERR_NO_FILE => 'Nenhum arquivo selecionado',
        UPLOAD_ERR_NO_TMP_DIR => 'Pasta temporária não encontrada',
        UPLOAD_ERR_CANT_WRITE => 'Erro ao escrever no disco',
        UPLOAD_ERR_EXTENSION => 'Extensão não permitida'
    ];
    
    $error_code = $_FILES['tenant_logo']['error'] ?? UPLOAD_ERR_NO_FILE;
    $error_msg = $error_messages[$error_code] ?? 'Erro desconhecido no upload';
    echo json_encode(['success' => false, 'message' => $error_msg]);
    exit;
}

$file_tmp = $_FILES['tenant_logo']['tmp_name'];
$file_size = $_FILES['tenant_logo']['size'];
$file_name = "tenant_logo_{$tenant_id}_" . time() . ".png";
$file_path = $upload_dir . $file_name;

// Validar tipo de arquivo
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$mime_type = finfo_file($finfo, $file_tmp);
finfo_close($finfo);

$allowed_types = ['image/jpeg', 'image/png', 'image/gif', 'image/webp'];
if (!in_array($mime_type, $allowed_types)) {
    echo json_encode(['success' => false, 'message' => 'Tipo de arquivo não permitido. Use JPG, PNG, GIF ou WebP.']);
    exit;
}

// Validar tamanho do arquivo (máximo 5MB)
if ($file_size > 5 * 1024 * 1024) {
    echo json_encode(['success' => false, 'message' => 'Arquivo muito grande. Tamanho máximo: 5MB.']);
    exit;
}

// Processar e redimensionar a imagem
try {
    // Criar imagem a partir do arquivo
    switch ($mime_type) {
        case 'image/jpeg':
            $image = imagecreatefromjpeg($file_tmp);
            break;
        case 'image/png':
            $image = imagecreatefrompng($file_tmp);
            break;
        case 'image/gif':
            $image = imagecreatefromgif($file_tmp);
            break;
        case 'image/webp':
            $image = imagecreatefromwebp($file_tmp);
            break;
        default:
            throw new Exception('Tipo de imagem não suportado');
    }

    if (!$image) {
        throw new Exception('Não foi possível criar a imagem a partir do arquivo');
    }

    // Redimensionar para tamanho máximo de 200x200px mantendo proporção
    $max_width = 200;
    $max_height = 200;

    $orig_width = imagesx($image);
    $orig_height = imagesy($image);

    // Calcular novas dimensões mantendo proporção
    $ratio = $orig_width / $orig_height;
    
    if ($max_width / $max_height > $ratio) {
        $new_width = $max_height * $ratio;
        $new_height = $max_height;
    } else {
        $new_width = $max_width;
        $new_height = $max_width / $ratio;
    }

    // Criar nova imagem
    $new_image = imagecreatetruecolor($new_width, $new_height);
    
    if (!$new_image) {
        throw new Exception('Não foi possível criar nova imagem');
    }
    
    // Manter transparência para PNG
    if ($mime_type === 'image/png' || $mime_type === 'image/webp') {
        imagealphablending($new_image, false);
        imagesavealpha($new_image, true);
        $transparent = imagecolorallocatealpha($new_image, 255, 255, 255, 127);
        imagefilledrectangle($new_image, 0, 0, $new_width, $new_height, $transparent);
    } else {
        // Fundo branco para JPEG e outros formatos
        $white = imagecolorallocate($new_image, 255, 255, 255);
        imagefill($new_image, 0, 0, $white);
    }

    // Redimensionar
    imagecopyresampled($new_image, $image, 0, 0, 0, 0, $new_width, $new_height, $orig_width, $orig_height);

    // Salvar como PNG
    if (!imagepng($new_image, $file_path, 8)) {
        throw new Exception('Não foi possível salvar a imagem');
    }

    // Liberar memória
    imagedestroy($image);
    imagedestroy($new_image);

    // Conectar ao banco de dados e atualizar a tabela tenants
    $db_config_path = 'config/database.php';
    if (!file_exists($db_config_path)) {
        throw new Exception('Arquivo de configuração do banco não encontrado');
    }
    
    require_once $db_config_path;
    
    try {
        $pdo = new PDO("mysql:host=$host;dbname=$dbname", $username, $password);
        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

        // Verificar se existe logo anterior para deletar o arquivo
        $stmt = $pdo->prepare("SELECT logo_path FROM tenants WHERE id = ?");
        $stmt->execute([$tenant_id]);
        $old_logo = $stmt->fetchColumn();

        // Deletar arquivo antigo se existir
        if ($old_logo && file_exists($old_logo)) {
            unlink($old_logo);
        }

        // Atualizar o caminho da logo no banco de dados
        $stmt = $pdo->prepare("UPDATE tenants SET logo_path = ? WHERE id = ?");
        $stmt->execute([$file_path, $tenant_id]);

        echo json_encode([
            'success' => true, 
            'logo_path' => $file_path,
            'message' => 'Logo atualizada com sucesso'
        ]);

    } catch (PDOException $e) {
        // Se der erro no banco, deletar o arquivo que foi salvo
        if (file_exists($file_path)) {
            unlink($file_path);
        }
        throw new Exception('Erro ao salvar no banco de dados: ' . $e->getMessage());
    }

} catch (Exception $e) {
    // Limpar arquivo temporário se existir
    if (isset($file_path) && file_exists($file_path)) {
        unlink($file_path);
    }
    echo json_encode(['success' => false, 'message' => 'Erro ao processar imagem: ' . $e->getMessage()]);
}
?>