import { NextRequest, NextResponse } from 'next/server';
import { db, schema } from '@/lib/db';
import { eq, sql } from 'drizzle-orm';
import { getSession } from '@/lib/auth';
import { getMaxUsersForPackage } from '@/lib/companies';
import type { PackageTier } from '@/lib/companies';
import { z } from 'zod';

const updateCompanySchema = z.object({
  name: z.string().min(1, 'Company name is required').max(100),
  package: z.enum(['starter', 'professional', 'enterprise']),
});

/**
 * PUT /api/admin/companies/[id]
 * Update a company (admin only)
 */
export async function PUT(
  request: NextRequest,
  { params }: { params: Promise<{ id: string }> }
) {
  try {
    const { id } = await params;
    const accessToken = request.cookies.get('scriba.access_token')?.value;
    const session = await getSession(accessToken);

    if (!session) {
      return NextResponse.json({ error: 'Unauthorized' }, { status: 401 });
    }

    // Check if user is admin
    const currentUser = await db.query.users.findFirst({
      where: eq(schema.users.id, session.user.id)
    });

    if (!currentUser || currentUser.role !== 'admin') {
      return NextResponse.json({ error: 'Forbidden - Admin access required' }, { status: 403 });
    }

    // Check if company exists
    const company = await db.query.companies.findFirst({
      where: eq(schema.companies.id, id)
    });

    if (!company) {
      return NextResponse.json({ error: 'Company not found' }, { status: 404 });
    }

    const body = await request.json();
    const parsed = updateCompanySchema.safeParse(body);

    if (!parsed.success) {
      return NextResponse.json(
        { error: parsed.error.issues[0]?.message ?? 'Invalid input' },
        { status: 400 }
      );
    }

    const { name, package: packageTier } = parsed.data;
    const maxUsers = getMaxUsersForPackage(packageTier as PackageTier);

    // Check if new max users would exceed current user count
    const userCountResult = await db
      .select({ count: sql<number>`count(*)` })
      .from(schema.users)
      .where(eq(schema.users.companyId, id));
    const currentUserCount = userCountResult[0]?.count || 0;

    if (currentUserCount > maxUsers) {
      return NextResponse.json(
        { error: `Cannot downgrade: company has ${currentUserCount} users but new package only allows ${maxUsers}` },
        { status: 400 }
      );
    }

    // Update company
    const [updated] = await db
      .update(schema.companies)
      .set({
        name,
        package: packageTier,
        maxUsers,
        updatedAt: new Date(),
      })
      .where(eq(schema.companies.id, id))
      .returning();

    return NextResponse.json({
      success: true,
      company: updated,
    });

  } catch (error) {
    console.error('Error updating company:', error);
    return NextResponse.json({ error: 'Failed to update company' }, { status: 500 });
  }
}

/**
 * DELETE /api/admin/companies/[id]
 * Delete a company and all associated users/projects (admin only)
 */
export async function DELETE(
  request: NextRequest,
  { params }: { params: Promise<{ id: string }> }
) {
  try {
    const { id } = await params;
    const accessToken = request.cookies.get('scriba.access_token')?.value;
    const session = await getSession(accessToken);

    if (!session) {
      return NextResponse.json({ error: 'Unauthorized' }, { status: 401 });
    }

    // Check if user is admin
    const currentUser = await db.query.users.findFirst({
      where: eq(schema.users.id, session.user.id)
    });

    if (!currentUser || currentUser.role !== 'admin') {
      return NextResponse.json({ error: 'Forbidden - Admin access required' }, { status: 403 });
    }

    // Check if company exists
    const company = await db.query.companies.findFirst({
      where: eq(schema.companies.id, id)
    });

    if (!company) {
      return NextResponse.json({ error: 'Company not found' }, { status: 404 });
    }

    // Delete all projects belonging to users of this company
    const companyUsers = await db
      .select({ id: schema.users.id })
      .from(schema.users)
      .where(eq(schema.users.companyId, id));

    const userIds = companyUsers.map(u => u.id);

    if (userIds.length > 0) {
      // Delete projects for all company users
      await db.delete(schema.projects).where(
        sql`${schema.projects.userId} IN (${sql.join(userIds.map(id => sql`${id}`), sql`, `)})`
      );
    }

    // Delete all users in the company
    await db.delete(schema.users).where(eq(schema.users.companyId, id));

    // Delete the company
    await db.delete(schema.companies).where(eq(schema.companies.id, id));

    return NextResponse.json({
      success: true,
      message: 'Company and all associated users and projects deleted successfully',
    });

  } catch (error) {
    console.error('Error deleting company:', error);
    return NextResponse.json({ error: 'Failed to delete company' }, { status: 500 });
  }
}
