import { NextResponse } from 'next/server';
import db from '@/lib/db';
import { getAdminSession } from '@/lib/auth';
import { getTokenSummary, getTokenAlerts, getDailyTokenBreakdown } from '@/lib/analytics/token-tracker';
import { getScrapingSummary, getScrapingErrors } from '@/lib/analytics/scraping-tracker';

// GET /api/admin/settings — fetch all settings
export async function GET(request: Request) {
  const session = await getAdminSession();
  if (!session) {
    return NextResponse.json({ error: 'Unauthorized' }, { status: 401 });
  }

  const { searchParams } = new URL(request.url);
  const section = searchParams.get('section');

  try {
    // Fetch all settings from admin_settings table
    const settingsRows = await db.query('SELECT setting_key, setting_value FROM admin_settings') as any[];
    const settings: Record<string, string> = {};
    (settingsRows || []).forEach((r: any) => {
      settings[r.setting_key] = r.setting_value;
    });

    // Fetch admin profile
    const adminRows = await db.query(
      'SELECT id, email, username, role, created_at FROM admins WHERE email = ?',
      [session.email]
    ) as any[];
    const admin = adminRows?.[0] || null;

    const result: any = {
      settings,
      profile: admin ? {
        id: admin.id,
        email: admin.email,
        username: admin.username,
        role: admin.role,
        createdAt: admin.created_at,
      } : null,
    };

    // If section-specific data requested, fetch it
    if (!section || section === 'token-usage') {
      const [tokenSummary, tokenAlerts, dailyBreakdown] = await Promise.all([
        getTokenSummary('monthly'),
        getTokenAlerts(),
        getDailyTokenBreakdown(),
      ]);
      result.tokenUsage = tokenSummary;
      result.tokenAlerts = tokenAlerts;
      result.tokenDailyBreakdown = dailyBreakdown;
    }

    if (!section || section === 'scraping') {
      const [scrapingSummary, scrapingErrors] = await Promise.all([
        getScrapingSummary('monthly'),
        getScrapingErrors(20),
      ]);
      result.scraping = scrapingSummary;
      result.scrapingErrors = scrapingErrors;
    }

    return NextResponse.json(result);
  } catch (error: any) {
    console.error('[Settings API] Error:', error.message);
    return NextResponse.json({ error: error.message }, { status: 500 });
  }
}

// PUT /api/admin/settings — update settings
export async function PUT(request: Request) {
  const session = await getAdminSession();
  if (!session) {
    return NextResponse.json({ error: 'Unauthorized' }, { status: 401 });
  }

  try {
    const body = await request.json();
    const { key, value, updates } = body;

    if (updates && typeof updates === 'object') {
      // Batch update
      for (const [k, v] of Object.entries(updates)) {
        await db.execute(
          'INSERT INTO admin_settings (setting_key, setting_value, updated_at) VALUES (?, ?, CURRENT_TIMESTAMP) ON CONFLICT(setting_key) DO UPDATE SET setting_value = ?, updated_at = CURRENT_TIMESTAMP',
          [k, String(v), String(v)]
        );
      }
      return NextResponse.json({ success: true });
    }

    if (!key || value === undefined) {
      return NextResponse.json({ error: 'key and value are required' }, { status: 400 });
    }

    // Sanitize inputs
    const sanitizedKey = String(key).replace(/[^a-z0-9_]/gi, '');
    const sanitizedValue = String(value).trim();

    await db.execute(
      'INSERT INTO admin_settings (setting_key, setting_value, updated_at) VALUES (?, ?, CURRENT_TIMESTAMP) ON CONFLICT(setting_key) DO UPDATE SET setting_value = ?, updated_at = CURRENT_TIMESTAMP',
      [sanitizedKey, sanitizedValue, sanitizedValue]
    );

    return NextResponse.json({ success: true });
  } catch (error: any) {
    console.error('[Settings API] Error:', error.message);
    return NextResponse.json({ error: error.message }, { status: 500 });
  }
}
