/**
 * Portfolio Sites API Route
 * GET /api/portfolio/sites - List portfolio sites
 * POST /api/portfolio/sites - Add a new site
 */

import { NextRequest, NextResponse } from 'next/server';
import { PrismaClient } from '@prisma/client';
import { AuthMiddleware } from '@/lib/auth';
import { ComplianceService } from '@/lib/compliance';

const prisma = new PrismaClient();

export async function GET(request: NextRequest) {
  try {
    // Require admin role
    const authResult = await AuthMiddleware.requireRole(request, 'ADMIN');
    if (authResult instanceof NextResponse) {
      return authResult;
    }

    const { searchParams } = new URL(request.url);
    const status = searchParams.get('status') || 'active';

    const sites = await prisma.portfolioSite.findMany({
      where: status !== 'all' ? { status } : undefined,
      orderBy: [
        { priorityScore: 'desc' },
        { createdAt: 'desc' },
      ],
    });

    return NextResponse.json({
      sites,
      total: sites.length,
    });
  } catch (error) {
    console.error('[API] Portfolio sites error:', error);
    return NextResponse.json(
      { error: 'Failed to fetch portfolio sites' },
      { status: 500 }
    );
  }
}

interface CreateSiteBody {
  domain: string;
  name: string;
  campaignTemplate?: string;
  priorityScore?: number;
  autoOptimize?: boolean;
}

export async function POST(request: NextRequest) {
  try {
    // Require admin role
    const authResult = await AuthMiddleware.requireRole(request, 'ADMIN');
    if (authResult instanceof NextResponse) {
      return authResult;
    }

    const body: CreateSiteBody = await request.json();

    if (!body.domain || !body.name) {
      return NextResponse.json(
        { error: 'Domain and name are required' },
        { status: 400 }
      );
    }

    // Normalize domain
    const normalizedDomain = body.domain
      .toLowerCase()
      .replace(/^https?:\/\//, '')
      .replace(/^www\./, '')
      .replace(/\/$/, '');

    // Check if domain already exists
    const existing = await prisma.portfolioSite.findUnique({
      where: { domain: normalizedDomain },
    });

    if (existing) {
      return NextResponse.json(
        { error: 'Domain already exists in portfolio' },
        { status: 409 }
      );
    }

    const site = await prisma.portfolioSite.create({
      data: {
        domain: normalizedDomain,
        name: body.name,
        campaignTemplate: body.campaignTemplate || 'zero_click_authority',
        priorityScore: body.priorityScore || 0,
        autoOptimize: body.autoOptimize || false,
        status: 'active',
      },
    });

    await ComplianceService.log('AGENT', 'PORTFOLIO_SITE_ADDED', 'PortfolioAPI', {
      siteId: site.id,
      domain: normalizedDomain,
      template: site.campaignTemplate,
    });

    return NextResponse.json({
      site,
      message: 'Site added to portfolio',
    }, { status: 201 });
  } catch (error) {
    console.error('[API] Add portfolio site error:', error);
    return NextResponse.json(
      { error: 'Failed to add portfolio site' },
      { status: 500 }
    );
  }
}
