import { FastifyInstance } from 'fastify';
import { scrapeOgData } from '../services/og-scraper.service.js';
import { query } from '../db/connection.js';
import sharp from 'sharp';
import fs from 'fs';
import path from 'path';
import { fileURLToPath } from 'url';

const __dirname = path.dirname(fileURLToPath(import.meta.url));
const DATA_DIR = path.resolve(__dirname, '../../data');

export async function ogScrapeRoutes(app: FastifyInstance) {
  app.get('/api/og-preview', async (request, reply) => {
    const { url } = request.query as { url?: string };
    if (!url) return reply.status(400).send({ error: 'url parameter required' });

    try {
      const data = await scrapeOgData(url);
      return data;
    } catch (err: any) {
      return reply.status(502).send({ error: `Failed to scrape: ${err.message}` });
    }
  });

  app.post('/api/recipes/:id/fetch-image', async (request, reply) => {
    const { id } = request.params as { id: string };
    const { url } = request.body as { url: string };

    if (!url) return reply.status(400).send({ error: 'url required' });

    const { rows } = await query('SELECT id FROM recipes WHERE id = $1', [id]);
    if (rows.length === 0) return reply.status(404).send({ error: 'Recipe not found' });

    try {
      const ogData = await scrapeOgData(url);
      if (!ogData.image) return reply.status(404).send({ error: 'No image found at URL' });

      const imgRes = await fetch(ogData.image, {
        headers: { 'User-Agent': 'Mozilla/5.0' },
        signal: AbortSignal.timeout(15000),
      });
      if (!imgRes.ok) throw new Error(`Image download failed: ${imgRes.status}`);

      const buffer = Buffer.from(await imgRes.arrayBuffer());

      const imgDir = path.join(DATA_DIR, 'images', 'recipes', id);
      fs.mkdirSync(imgDir, { recursive: true });
      const imgPath = path.join(imgDir, 'hero.webp');

      await sharp(buffer)
        .resize(1200, null, { withoutEnlargement: true })
        .webp({ quality: 85 })
        .toFile(imgPath);

      const imageUrl = `/images/recipes/${id}/hero.webp`;
      await query('UPDATE recipes SET image_url = $1, source_url = $2, updated_at = NOW() WHERE id = $3', [imageUrl, url, id]);

      return {
        ok: true,
        image_url: imageUrl,
        og_title: ogData.title,
        og_description: ogData.description,
      };
    } catch (err: any) {
      return reply.status(502).send({ error: `Failed: ${err.message}` });
    }
  });
}
