const router = require('express').Router()
const fs = require('node:fs')
const path = require('node:path')

// Функция для чтения JSON файла и случайной модификации содержимого
function readAndModifyJson(filePath) {
  try {
    // Используем fs.readFileSync вместо require для избежания кэширования
    const fullPath = path.resolve(__dirname, filePath);
    const fileContent = fs.readFileSync(fullPath, 'utf8');
    const jsonContent = JSON.parse(fileContent);
    
    // Если это список учеников, немного перемешаем их
    if (jsonContent.body && Array.isArray(jsonContent.body.students)) {
      jsonContent.body.students.sort(() => 0.5 - Math.random());
    }
    
    // Если это список реакций, обновим время создания и слегка перемешаем
    if (jsonContent.body && Array.isArray(jsonContent.body.reactions)) {
      const now = Date.now();
      jsonContent.body.reactions.forEach((reaction, index) => {
        // Интервал от 10 секунд до 2 минут назад
        const randomTime = now - Math.floor(Math.random() * (120000 - 10000) + 10000);
        reaction.created = new Date(randomTime).toISOString();
      });
      
      // Сортируем реакции по времени создания (новые сверху)
      jsonContent.body.reactions.sort((a, b) => 
        new Date(b.created) - new Date(a.created)
      );
    }
    
    // Если это список уроков, обновим даты
    if (jsonContent.body && Array.isArray(jsonContent.body) && jsonContent.body[0] && jsonContent.body[0].name) {
      jsonContent.body.forEach((lesson) => {
        // Случайная дата в пределах последних 3 месяцев
        const randomDate = new Date();
        randomDate.setDate(randomDate.getDate() - Math.random() * 30);
        lesson.date = randomDate.toISOString();
        lesson.created = new Date(randomDate.getTime() - 86400000).toISOString(); // Создан за день до даты
      });
    }
    
    // Если это список курсов, добавим случайные данные
    if (jsonContent.body && Array.isArray(jsonContent.body) && jsonContent.body[0] && jsonContent.body[0].id) {
      jsonContent.body.forEach((course) => {
        course.startDt = new Date(new Date().getTime() - Math.random() * 31536000000).toISOString(); // В пределах года
        course.created = new Date(new Date(course.startDt).getTime() - 604800000).toISOString(); // Создан за неделю до начала
      });
    }
    
    return jsonContent;
  } catch (error) {
    console.error(`Error reading/modifying file ${filePath}:`, error);
    return { success: false, error: "Failed to read file" };
  }
}

// Функция для чтения JSON без модификации
function readJsonFile(filePath) {
  try {
    const fullPath = path.resolve(__dirname, filePath);
    const fileContent = fs.readFileSync(fullPath, 'utf8');
    return JSON.parse(fileContent);
  } catch (error) {
    console.error(`Error reading file ${filePath}:`, error);
    return { success: false, error: "Failed to read file" };
  }
}

const timer =
(time = 1000) =>
  (_req, _res, next) =>
    setTimeout(next, time)

// Небольшая задержка для имитации реальной сети
router.use(timer(100));

const config = {
  examCreated: false
}

router.get('/course/list', (req, res) => {
  const modifiedData = readAndModifyJson('../mocks/courses/list/success.json');
  res.send(modifiedData);
})

router.get('/course/:id', (req, res) => {
  if(req.params.id === 'undefined')
    return res.status(400).send({ success: false, error: 'Invalid course id' })
  
  if (config.examCreated) {
    config.examCreated = false;
    const modifiedData = readAndModifyJson('../mocks/courses/by-id/with-exam.json');
    return res.send(modifiedData);
  }
  
  const modifiedData = readAndModifyJson('../mocks/courses/by-id/success.json');
  res.send(modifiedData);
})

router.get('/course/students/:courseId', (req, res) => {
  const modifiedData = readAndModifyJson('../mocks/courses/all-students/success.json');
  res.send(modifiedData);
})

router.post('/course', (req, res) => {
  const baseData = readJsonFile('../mocks/courses/create/success.json');
  
  // Добавляем данные из запроса
  if (baseData.body) {
    baseData.body.name = req.body.name || baseData.body.name;
    baseData.body.created = new Date().toISOString();
  }
  
  res.send(baseData);
})

router.post('/course/toggle-exam-with-jury/:id', (req, res) => {
  config.examCreated = true;
  res.send({ success: true })
})

router.get('/lesson/list/:courseId', (req, res) => {
  const modifiedData = readAndModifyJson('../mocks/lessons/list/success.json');
  res.send(modifiedData);
})

router.get('/lesson/:courseId/ai/generate-lessons', timer(3000), (req, res) => {
  const modifiedData = readAndModifyJson('../mocks/lessons/generate/success.json');
  res.send(modifiedData);
})

router.post('/lesson', (req, res) => {
  const baseData = readJsonFile('../mocks/lessons/create/success.json');
  
  // Добавляем данные из запроса
  if (baseData.body) {
    baseData.body.name = req.body.name || baseData.body.name;
    baseData.body.date = req.body.date || new Date().toISOString();
    baseData.body.created = new Date().toISOString();
  }
  
  res.send(baseData);
})

router.post('/lesson/access-code', (req, res) => {
  const modifiedData = readAndModifyJson('../mocks/lessons/access-code/create/success.json');
  
  // Обновляем дату истечения через час от текущего времени
  if (modifiedData.body) {
    modifiedData.body.expires = new Date(Date.now() + 60 * 60 * 1000).toISOString();
    modifiedData.body.created = new Date().toISOString();
  }
  
  res.send(modifiedData);
})

router.get('/lesson/access-code/:accessCode', (req, res) => {
  const modifiedData = readAndModifyJson('../mocks/lessons/access-code/get/success.json');
  
  // Обновляем дату истечения через час от текущего времени
  if (modifiedData.body && modifiedData.body.accessCode) {
    modifiedData.body.accessCode.expires = new Date(Date.now() + 60 * 60 * 1000).toISOString();
    modifiedData.body.accessCode.created = new Date().toISOString();
  }
  
  res.send(modifiedData);
})

router.get('/lesson/:lessonId', (req, res) => {
  const modifiedData = readAndModifyJson('../mocks/lessons/byid/success.json');
  
  // Обновляем даты
  if (modifiedData.body) {
    modifiedData.body.date = new Date().toISOString();
    modifiedData.body.created = new Date(Date.now() - 86400000).toISOString(); // Создан день назад
  }
  
  res.send(modifiedData);
})

router.delete('/lesson/:lessonId', (req, res) => {
  res.send({ success: true, body: { ok: true }})
})

router.put('/lesson', (req, res) => {
  res.send({ success: true, body: req.body })
})

router.post('/lesson/reaction/:lessonId', (req, res) => {
  // Simulate processing a new reaction
  const { reaction } = req.body;
  const lessonId = req.params.lessonId;
  
  // Log the reaction for debugging
  console.log(`Received reaction "${reaction}" for lesson ${lessonId}`);
  
  // Return success response
  res.send({
    success: true,
    body: {
      _id: `r-${Date.now()}-${Math.floor(Math.random() * 1000)}`,
      reaction,
      lessonId,
      created: new Date().toISOString()
    }
  });
});

module.exports = router