const express = require('express');
const fs = require('fs');
const path = require('path');

const app = express();
const PORT = process.env.PORT || 3000;
const ROOMS_FILE = path.join(__dirname, 'rooms.json');

// Middleware para processar JSON
app.use(express.json());

// Servir arquivos estáticos do frontend (arquivos da raiz do projeto)
app.use(express.static(__dirname));

// Servir as fotos dos ambientes a partir da pasta correta
app.use('/images', express.static(path.join(__dirname, 'Prepara‡ֶo Mochilֶo')));

// Endpoint para ler todas as salas
app.get('/api/rooms', (req, res) => {
  fs.readFile(ROOMS_FILE, 'utf8', (err, data) => {
    if (err) {
      console.error("Erro ao ler rooms.json:", err);
      return res.status(500).json({ error: "Erro ao ler banco de dados local" });
    }
    try {
      const rooms = JSON.parse(data);
      res.json(rooms);
    } catch (parseErr) {
      console.error("Erro ao fazer parse de rooms.json:", parseErr);
      res.status(500).json({ error: "Erro no formato do banco de dados local" });
    }
  });
});

// Endpoint para atualizar uma sala específica (por ID)
app.put('/api/rooms/:id', (req, res) => {
  const roomId = req.params.id;
  const updatedData = req.body;

  fs.readFile(ROOMS_FILE, 'utf8', (err, data) => {
    if (err) {
      console.error("Erro ao ler rooms.json:", err);
      return res.status(500).json({ error: "Erro ao ler banco de dados" });
    }

    try {
      let rooms = JSON.parse(data);
      const roomIndex = rooms.findIndex(r => r.id === roomId);

      if (roomIndex === -1) {
        return res.status(404).json({ error: "Sala não encontrada" });
      }

      // Mesclar dados existentes com os novos dados
      rooms[roomIndex] = {
        ...rooms[roomIndex],
        ...updatedData,
        id: roomId // Garantir que o ID não seja alterado
      };

      fs.writeFile(ROOMS_FILE, JSON.stringify(rooms, null, 2), 'utf8', (writeErr) => {
        if (writeErr) {
          console.error("Erro ao salvar rooms.json:", writeErr);
          return res.status(500).json({ error: "Erro ao salvar dados no disco" });
        }
        res.json({ success: true, room: rooms[roomIndex] });
      });

    } catch (parseErr) {
      console.error("Erro ao fazer parse de rooms.json:", parseErr);
      res.status(500).json({ error: "Erro de processamento de dados" });
    }
  });
});

// Endpoint para upload de fotos para uma sala específica
app.post('/api/rooms/:id/upload', (req, res) => {
  const roomId = req.params.id;
  const { filename, base64Data } = req.body;

  if (!filename || !base64Data) {
    return res.status(400).json({ error: "Dados incompletos para upload" });
  }

  // Converter base64 para buffer binário
  const buffer = Buffer.from(base64Data, 'base64');
  const targetDir = path.join(__dirname, 'Prepara‡ֶo Mochilֶo');

  // Criar pasta se não existir
  if (!fs.existsSync(targetDir)) {
    fs.mkdirSync(targetDir, { recursive: true });
  }

  // Evitar colisões de nomes gerando um nome único se o arquivo já existir
  let finalFilename = filename;
  let targetPath = path.join(targetDir, finalFilename);
  let counter = 1;
  while (fs.existsSync(targetPath)) {
    const ext = path.extname(filename);
    const name = path.basename(filename, ext);
    finalFilename = `${name}_${counter}${ext}`;
    targetPath = path.join(targetDir, finalFilename);
    counter++;
  }

  fs.writeFile(targetPath, buffer, (writeErr) => {
    if (writeErr) {
      console.error("Erro ao gravar arquivo no disco:", writeErr);
      return res.status(500).json({ error: "Erro ao gravar imagem" });
    }

    // Atualizar o rooms.json
    fs.readFile(ROOMS_FILE, 'utf8', (readErr, data) => {
      if (readErr) return res.status(500).json({ error: "Erro ao ler banco de dados" });

      try {
        let rooms = JSON.parse(data);
        const idx = rooms.findIndex(r => r.id === roomId);
        if (idx === -1) return res.status(404).json({ error: "Sala não encontrada" });

        if (!rooms[idx].images) rooms[idx].images = [];
        rooms[idx].images.push(finalFilename);

        fs.writeFile(ROOMS_FILE, JSON.stringify(rooms, null, 2), 'utf8', (saveErr) => {
          if (saveErr) return res.status(500).json({ error: "Erro ao atualizar dados" });
          res.json({ success: true, filename: finalFilename, room: rooms[idx] });
        });
      } catch (e) {
        res.status(500).json({ error: "Erro interno de parse" });
      }
    });
  });
});

// Endpoint global para atualizar todas as salas de uma vez (ex: atualizar mapa completo)
app.post('/api/rooms/bulk', (req, res) => {
  const rooms = req.body;
  if (!Array.isArray(rooms)) {
    return res.status(400).json({ error: "Os dados enviados devem ser uma lista de salas" });
  }

  fs.writeFile(ROOMS_FILE, JSON.stringify(rooms, null, 2), 'utf8', (writeErr) => {
    if (writeErr) {
      console.error("Erro ao salvar rooms.json:", writeErr);
      return res.status(500).json({ error: "Erro ao salvar dados" });
    }
    res.json({ success: true });
  });
});

app.listen(PORT, () => {
  console.log(`====================================================`);
  console.log(`Servidor rodando com sucesso!`);
  console.log(`Acesse a plataforma em: http://localhost:${PORT}`);
  console.log(`====================================================`);
});
