import express from 'express';
import cors from 'cors';
import bodyParser from 'body-parser';
import dotenv from 'dotenv';
import { fileURLToPath } from 'url';
import { dirname, join } from 'path';
import generateRoute from './routes/generate.js';

dotenv.config();

const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);

const app = express();
const PORT = process.env.PORT || 3000;

// Middleware
app.use(cors());
app.use(bodyParser.json({ limit: '50mb' }));
app.use(bodyParser.urlencoded({ limit: '50mb', extended: true }));

// Health check
app.get('/health', (req, res) => {
  res.json({
    status: 'ok',
    version: '1.0.0',
    service: 'remotion-express-app',
    timestamp: new Date().toISOString(),
  });
});

// API Info
app.get('/api/info', (req, res) => {
  res.json({
    name: 'Remotion Express Service',
    version: '1.0.0',
    endpoints: {
      health: '/health',
      info: '/api/info',
      generate: 'POST /api/generate',
      tts: 'POST /api/tts',
      render: 'POST /api/render',
    },
  });
});

// Main video generation endpoint
app.use('/api/generate', generateRoute);

// TTS Endpoint (ElevenLabs placeholder)
app.post('/api/tts', async (req, res) => {
  try {
    const { text, voiceId } = req.body;

    if (!text) {
      return res.status(400).json({ error: 'text is required' });
    }

    // Placeholder: integrate ElevenLabs SDK here
    res.json({
      message: 'TTS endpoint ready',
      text,
      voiceId: voiceId || process.env.ELEVENLABS_VOICE_ID,
    });
  } catch (error: any) {
    res.status(500).json({ error: error.message });
  }
});

// Render Endpoint (Remotion placeholder)
app.post('/api/render', async (req, res) => {
  try {
    const { composition, props } = req.body;

    if (!composition) {
      return res.status(400).json({ error: 'composition name is required' });
    }

    // Placeholder: integrate Remotion rendering here
    res.json({
      message: 'Render endpoint ready',
      composition,
      props: props || {},
      outputDir: process.env.REMOTION_OUTPUT_DIR || './generated/videos',
    });
  } catch (error: any) {
    res.status(500).json({ error: error.message });
  }
});

// 404 handler
app.use((req, res) => {
  res.status(404).json({ error: 'Not found' });
});

// Error handler
app.use(
  (err: any, req: express.Request, res: express.Response, next: express.NextFunction) => {
    console.error('[ERROR]', err);
    res.status(500).json({
      error: 'Internal server error',
      message: process.env.NODE_ENV === 'development' ? err.message : undefined,
    });
  }
);

// Start server
app.listen(PORT, () => {
  console.log(`✓ Server running on http://localhost:${PORT}`);
  console.log(`✓ Environment: ${process.env.NODE_ENV || 'development'}`);
  console.log(`✓ Health check: GET http://localhost:${PORT}/health`);
});

export default app;
