import { type NextRequest, NextResponse } from "next/server"
import { applicationDb } from "@/lib/db"
import type { ApiResponse } from "@/lib/types"

// Submit final application
export async function POST(request: NextRequest) {
  try {
    // Get user ID from session cookie (simplified)
    const sessionCookie = request.cookies.get("session")
    if (!sessionCookie) {
      return NextResponse.json<ApiResponse>(
        {
          success: false,
          error: "Not authenticated",
        },
        { status: 401 },
      )
    }

    const session = JSON.parse(sessionCookie.value)
    const userId = session.userId

    const application = await applicationDb.findByUserId(userId)

    if (!application) {
      return NextResponse.json<ApiResponse>(
        {
          success: false,
          error: "Application not found",
        },
        { status: 404 },
      )
    }

    if (application.submitted) {
      return NextResponse.json<ApiResponse>(
        {
          success: false,
          error: "Application has already been submitted",
        },
        { status: 400 },
      )
    }

    // Validate required fields
    const validationErrors = validateApplication(application)
    if (validationErrors.length > 0) {
      return NextResponse.json<ApiResponse>(
        {
          success: false,
          error: "Application validation failed",
          data: { errors: validationErrors },
        },
        { status: 400 },
      )
    }

    // Submit application
    const success = await applicationDb.submit(userId)

    if (!success) {
      return NextResponse.json<ApiResponse>(
        {
          success: false,
          error: "Failed to submit application",
        },
        { status: 500 },
      )
    }

    // In a real app, you would:
    // 1. Send confirmation email
    // 2. Generate application ID
    // 3. Update admission status
    // 4. Notify admissions team

    const applicationId = `FU2024-${Math.random().toString(36).substr(2, 9).toUpperCase()}`

    return NextResponse.json<ApiResponse>({
      success: true,
      data: { applicationId },
      message: "Application submitted successfully",
    })
  } catch (error) {
    console.error("Submit application error:", error)
    return NextResponse.json<ApiResponse>(
      {
        success: false,
        error: "Internal server error",
      },
      { status: 500 },
    )
  }
}

function validateApplication(application: any): string[] {
  const errors: string[] = []

  // Validate biodata
  if (!application.biodata.firstName) errors.push("First name is required")
  if (!application.biodata.lastName) errors.push("Last name is required")
  if (!application.biodata.dateOfBirth) errors.push("Date of birth is required")
  if (!application.biodata.gender) errors.push("Gender is required")
  if (!application.biodata.nationality) errors.push("Nationality is required")
  if (!application.biodata.phoneNumber) errors.push("Phone number is required")
  if (!application.biodata.email) errors.push("Email is required")

  // Validate address
  if (!application.address.permanentAddress) errors.push("Permanent address is required")
  if (!application.address.permanentCity) errors.push("Permanent city is required")
  if (!application.address.permanentState) errors.push("Permanent state is required")
  if (!application.address.permanentCountry) errors.push("Permanent country is required")

  // Validate program
  if (!application.program.firstChoice) errors.push("First choice program is required")
  if (!application.program.studyMode) errors.push("Study mode is required")
  if (!application.program.entryLevel) errors.push("Entry level is required")
  if (!application.program.personalStatement) errors.push("Personal statement is required")

  // Validate guardian
  if (!application.guardian.guardianName) errors.push("Guardian name is required")
  if (!application.guardian.relationship) errors.push("Guardian relationship is required")
  if (!application.guardian.phoneNumber) errors.push("Guardian phone number is required")
  if (!application.guardian.emergencyName) errors.push("Emergency contact name is required")
  if (!application.guardian.emergencyPhone) errors.push("Emergency contact phone is required")

  // Validate referees (at least 2 required)
  if (!application.referee.referees || application.referee.referees.length < 2) {
    errors.push("At least 2 referees are required")
  }

  // Validate required documents
  const requiredDocuments = ["passport", "certificate", "transcript", "birth_certificate", "identification"]
  const uploadedCategories = application.uploads.files.map((f: any) => f.category)

  for (const doc of requiredDocuments) {
    if (!uploadedCategories.includes(doc)) {
      errors.push(`${doc.replace("_", " ")} document is required`)
    }
  }

  // Validate declaration
  if (!application.declaration.truthfulnessDeclaration) errors.push("Truthfulness declaration is required")
  if (!application.declaration.accuracyDeclaration) errors.push("Accuracy declaration is required")
  if (!application.declaration.consequencesDeclaration) errors.push("Consequences declaration is required")
  if (!application.declaration.updatesDeclaration) errors.push("Updates declaration is required")
  if (!application.declaration.termsDeclaration) errors.push("Terms declaration is required")
  if (!application.declaration.signature) errors.push("Digital signature is required")

  return errors
}
