import type { FastifyInstance } from 'fastify';
import { config } from '../config.js';
import { intakeService } from '../services/intake.service.js';
import { gmailService } from '../services/gmail.service.js';
import { mondayService } from '../services/monday.service.js';
import { requireAdminAuth } from '../middleware/auth.js';
import { ingestSchema } from '../schemas.js';

export async function sourceRoutes(app: FastifyInstance): Promise<void> {
  app.get('/api/gmail/status', { preHandler: requireAdminAuth }, async () => gmailService.getStatus());

  app.get('/api/gmail/auth-url', { preHandler: requireAdminAuth }, async (_req, reply) => {
    const url = gmailService.getAuthUrl();
    if (!url) return reply.code(503).send({ error: 'gmail_not_configured' });
    return { url };
  });

  app.get('/api/gmail/callback', async (request, reply) => {
    const code = (request.query as { code?: string }).code;
    if (!code) return reply.code(400).send({ error: 'missing_code' });
    try {
      const result = await gmailService.handleCallback(code);
      return reply.redirect(`/?gmail=connected&email=${encodeURIComponent(result.email ?? '')}`);
    } catch (err) {
      return reply.code(500).send({
        error: 'oauth_failed',
        message: err instanceof Error ? err.message : 'Unknown error',
      });
    }
  });

  app.post('/api/gmail/poll', { preHandler: requireAdminAuth }, async () => gmailService.poll());

  app.get('/api/monday/status', { preHandler: requireAdminAuth }, async () => mondayService.getStatus());

  app.post('/api/monday/poll', { preHandler: requireAdminAuth }, async () => mondayService.poll());

  if (config.isDev) {
    app.post('/api/demo/ingest', { preHandler: requireAdminAuth }, async (request, reply) => {
      const parsed = ingestSchema.safeParse({
        ...(request.body as object),
        source_type: 'demo',
      });
      if (!parsed.success) {
        return reply.code(400).send({ error: 'validation_error', details: parsed.error.flatten() });
      }
      const externalId = parsed.data.source_external_id || `demo-${Date.now()}`;
      const result = intakeService.ingest({
        ...parsed.data,
        source_type: 'demo',
        source_external_id: externalId,
      });
      return reply.code(result.created ? 201 : 200).send(result);
    });

    app.post('/api/demo/seed', { preHandler: requireAdminAuth }, async () => {
      const samples = buildDemoSamples();
      const results = samples.map((s) => intakeService.ingest(s));
      return {
        created: results.filter((r) => r.created).length,
        duplicates: results.filter((r) => r.duplicate).length,
        items: results.map((r) => r.item.id),
      };
    });
  }
}

function buildDemoSamples() {
  const now = new Date();
  return [
    {
      source_type: 'demo' as const,
      source_external_id: 'demo-gmail-001',
      source_url: 'https://mail.google.com/mail/u/0/#inbox/demo001',
      sender_name: 'Client Demo',
      sender_email: 'client.demo@example.com',
      client_project: 'Site PrestaShop',
      title: 'Problème de paiement sur le checkout',
      body: 'Bonjour,\n\nDepuis hier, les clients ne peuvent plus finaliser leur commande. Message d\'erreur CB.\n\nMerci',
      metadata: { thread_id: 'thread-demo-001' },
      attachments: [{ filename: 'screenshot.png', mimeType: 'image/png', size: 45000 }],
      received_at: new Date(now.getTime() - 3600000).toISOString(),
    },
    {
      source_type: 'monday_chrome' as const,
      source_account: 'chrome',
      source_external_id: 'monday-item-9876543',
      source_url: 'https://example.monday.com/boards/123/pulses/9876543',
      sender_name: 'Marie Dupont',
      sender_id: 'monday-user-42',
      client_project: 'Board Support',
      title: 'Migration serveur urgente',
      body: 'Le client demande une migration avant vendredi. DNS à prévoir.',
      metadata: { board_id: '123', item_id: '9876543' },
      received_at: new Date(now.getTime() - 7200000).toISOString(),
    },
    {
      source_type: 'monday_api' as const,
      source_account: '456',
      source_external_id: 'monday-api-555',
      source_url: 'https://example.monday.com/boards/456/pulses/555',
      sender_name: 'Support Monday',
      sender_email: 'support@client.com',
      title: 'Mise à jour module shipping',
      body: 'Item créé via API Monday pour test.',
      received_at: new Date(now.getTime() - 86400000).toISOString(),
    },
  ];
}

export { buildDemoSamples };
