import express from 'express';
import cors from 'cors';
import path from 'path';
import fs from 'fs';
import { fileURLToPath } from 'url';
import multer from 'multer';

// 获取当前文件的目录路径
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);

const app = express();
const PORT = 3000;
const CONFIG_FILE_PATH = path.join(__dirname, 'data', 'config.json');

// 创建上传目录
const uploadDir = path.join(__dirname, 'uploads');
if (!fs.existsSync(uploadDir)) {
  fs.mkdirSync(uploadDir, { recursive: true });
}

// 配置multer
const storage = multer.diskStorage({
  destination: (req, file, cb) => {
    cb(null, uploadDir);
  },
  filename: (req, file, cb) => {
    const timestamp = Date.now();
    const ext = path.extname(file.originalname);
    const filename = `${timestamp}${ext}`;
    cb(null, filename);
  }
});

// 文件上传
const upload = multer({ 
  storage,
  limits: { fileSize: 5 * 1024 * 1024 }, // 5MB限制
  fileFilter: (req, file, cb) => {
    const allowedTypes = /jpeg|jpg|png|gif/;
    const extname = allowedTypes.test(path.extname(file.originalname).toLowerCase());
    const mimetype = allowedTypes.test(file.mimetype);
    if (extname && mimetype) {
      return cb(null, true);
    } else {
      cb(new Error('只允许上传图片文件（JPEG、JPG、PNG、GIF）'));
    }
  }
});

// 音乐上传
const musicUpload = multer({
  storage,
  limits: { fileSize: 10 * 1024 * 1024 }, // 10MB音乐文件限制
  fileFilter: (req, file, cb) => {
    // 仅允许MP3格式
    const allowedTypes = /mp3/;
    const extname = allowedTypes.test(path.extname(file.originalname).toLowerCase());
    const mimetype = allowedTypes.test(file.mimetype) || file.mimetype === 'audio/mpeg';
    if (extname && mimetype) {
      return cb(null, true);
    } else {
      cb(new Error('只允许上传MP3格式的音频文件！'));
    }
  }
});

// 中间件
app.use(cors());
app.use(express.json());

// 静态文件服务（Vue应用和上传的图片）
app.use(express.static(path.join(__dirname, 'dist')));
app.use('/uploads', express.static(uploadDir));

// API: 获取配置数据
app.get('/api/config', (req, res) => {
  try {
    const configData = fs.readFileSync(CONFIG_FILE_PATH, 'utf8');
    res.json(JSON.parse(configData));
  } catch (error) {
    console.error('读取配置文件失败:', error);
    res.status(500).json({ error: '读取配置文件失败' });
  }
});

// API: 保存配置数据
app.post('/api/config', (req, res) => {
  try {
    fs.writeFileSync(CONFIG_FILE_PATH, JSON.stringify(req.body, null, 2), 'utf8');
    res.json({ success: true });
  } catch (error) {
    console.error('保存配置文件失败:', error);
    res.status(500).json({ error: '保存配置文件失败' });
  }
});


// API: 上传图片
app.post('/api/upload', upload.single('image'), (req, res) => {
  try {
    if (!req.file) {
      return res.status(400).json({ error: '没有文件上传' });
    }
    
    // 返回文件的相对路径
    const relativePath = `/uploads/${req.file.filename}`;
    res.json({ 
      success: true, 
      filePath: relativePath,
      filename: req.file.filename
    });
  } catch (error) {
    console.error('文件上传失败:', error);
    res.status(500).json({ error: error.message || '文件上传失败' });
  }
});

// API: 删除图片
app.delete('/api/upload/:filename', (req, res) => {
  try {
    const filename = req.params.filename;
    const filePath = path.join(uploadDir, filename);
    
    if (fs.existsSync(filePath)) {
      fs.unlinkSync(filePath);
      res.json({ success: true });
    } else {
      res.status(404).json({ error: '文件不存在' });
    }
  } catch (error) {
    console.error('文件删除失败:', error);
    res.status(500).json({ error: '文件删除失败' });
  }
});

// API: 上传音乐
app.post('/api/music', musicUpload.single('music'), (req, res) => {
  try {
    if (!req.file) {
      return res.status(400).json({ error: '没有文件上传' });
    }
    
    // 返回文件的相对路径和完整信息
    const relativePath = `/uploads/${req.file.filename}`;
    res.json({ 
      success: true, 
      filePath: relativePath,
      filename: req.file.filename,
      originalName: req.file.originalname,
      size: req.file.size
    });
  } catch (error) {
    console.error('音乐上传失败:', error);
    res.status(500).json({ error: error.message || '音乐上传失败' });
  }
});

// API: 删除音乐
app.delete('/api/music/:filename', (req, res) => {
  try {
    const filename = req.params.filename;
    const filePath = path.join(uploadDir, filename);
    
    if (fs.existsSync(filePath)) {
      fs.unlinkSync(filePath);
      res.json({ success: true });
    } else {
      res.status(404).json({ error: '音乐文件不存在' });
    }
  } catch (error) {
    console.error('音乐删除失败:', error);
    res.status(500).json({ error: '音乐删除失败' });
  }
});

// API: 获取音乐文件列表
app.get('/api/music', (req, res) => {
  try {
    const files = fs.readdirSync(uploadDir)
      .filter(file => {
        const ext = path.extname(file).toLowerCase();
        return ['.mp3', '.wav', '.ogg', '.m4a'].includes(ext);
      })
      .map(file => {
        const filePath = path.join(uploadDir, file);
        const stats = fs.statSync(filePath);
        return {
          filename: file,
          filePath: `/uploads/${file}`,
          size: stats.size,
          createdAt: stats.birthtime.toISOString(),
          modifiedAt: stats.mtime.toISOString()
        };
      });
    
    res.json({ success: true, files });
  } catch (error) {
    console.error('获取音乐列表失败:', error);
    res.status(500).json({ error: '获取音乐列表失败' });
  }
});

// 处理Vue Router历史模式 - 使用正则表达式代替通配符
app.get(/^((?!\/api).)*$/, (req, res) => {
  res.sendFile(path.join(__dirname, 'dist', 'index.html'));
});

// 启动服务器并监听错误
const server = app.listen(PORT, '0.0.0.0', () => {
  console.log(`服务器运行在 http://localhost:${PORT}`);
  console.log('服务器已成功启动，可以访问 http://localhost:3000');
  console.log('API端点: GET/POST /api/config');
});

// 监听服务器错误
server.on('error', (error) => {
  console.error('服务器错误:', error);
  
  if (error.code === 'EADDRINUSE') {
    console.error(`端口 ${PORT} 已被占用，请尝试其他端口。`);
  }
});

// 监听SIGINT信号（Ctrl+C）
process.on('SIGINT', () => {
  console.log('正在关闭服务器...');
  server.close(() => {
    console.log('服务器已关闭');
    process.exit(0);
  });
});

// 确保服务器持续运行
setInterval(() => {
  // 保持服务器活动的空操作
}, 60000); // 每分钟执行一次