import { createLogger } from '@sim/logger'
import { getErrorMessage } from '@sim/utils/errors'
import { type NextRequest, NextResponse } from 'next/server'
import { workdayCreatePrehireContract } from '@/lib/api/contracts/tools/workday'
import { parseRequest } from '@/lib/api/server'
import { checkInternalAuth } from '@/lib/auth/hybrid'
import { generateRequestId } from '@/lib/core/utils/request'
import { withRouteHandler } from '@/lib/core/utils/with-route-handler'
import { createWorkdaySoapClient, extractRefId, wdRef } from '@/tools/workday/soap'

export const dynamic = 'force-dynamic'

const logger = createLogger('WorkdayCreatePrehireAPI')

export const POST = withRouteHandler(async (request: NextRequest) => {
  const requestId = generateRequestId()

  try {
    const authResult = await checkInternalAuth(request, { requireWorkflowId: false })
    if (!authResult.success) {
      return NextResponse.json({ success: false, error: 'Unauthorized' }, { status: 401 })
    }

    const parsed = await parseRequest(workdayCreatePrehireContract, request, {})
    if (!parsed.success) return parsed.response
    const data = parsed.data.body

    if (!data.email && !data.phoneNumber && !data.address) {
      return NextResponse.json(
        {
          success: false,
          error: 'At least one contact method (email, phone, or address) is required',
        },
        { status: 400 }
      )
    }

    const parts = data.legalName.trim().split(/\s+/)
    const firstName = parts[0] ?? ''
    const lastName = parts.length > 1 ? parts.slice(1).join(' ') : ''

    if (!lastName) {
      return NextResponse.json(
        { success: false, error: 'Legal name must include both a first name and last name' },
        { status: 400 }
      )
    }

    const client = await createWorkdaySoapClient(
      data.tenantUrl,
      data.tenant,
      'recruiting',
      data.username,
      data.password
    )

    const contactData: Record<string, unknown> = {}
    if (data.email) {
      contactData.Email_Address_Data = [
        {
          Email_Address: data.email,
          Usage_Data: {
            Type_Data: { Type_Reference: wdRef('Communication_Usage_Type_ID', 'WORK') },
            Public: true,
          },
        },
      ]
    }
    if (data.phoneNumber) {
      contactData.Phone_Data = [
        {
          Phone_Number: data.phoneNumber,
          Phone_Device_Type_Reference: wdRef('Phone_Device_Type_ID', 'Landline'),
          Usage_Data: {
            Type_Data: { Type_Reference: wdRef('Communication_Usage_Type_ID', 'WORK') },
            Public: true,
          },
        },
      ]
    }
    if (data.address) {
      contactData.Address_Data = [
        {
          Formatted_Address: data.address,
          Usage_Data: {
            Type_Data: { Type_Reference: wdRef('Communication_Usage_Type_ID', 'WORK') },
            Public: true,
          },
        },
      ]
    }

    const [result] = await client.Put_ApplicantAsync({
      Applicant_Data: {
        Personal_Data: {
          Name_Data: {
            Legal_Name_Data: {
              Name_Detail_Data: {
                Country_Reference: wdRef('ISO_3166-1_Alpha-2_Code', data.countryCode ?? 'US'),
                First_Name: firstName,
                Last_Name: lastName,
              },
            },
          },
          Contact_Information_Data: contactData,
        },
      },
    })

    const applicantRef = result?.Applicant_Reference

    return NextResponse.json({
      success: true,
      output: {
        preHireId: extractRefId(applicantRef),
        descriptor: applicantRef?.attributes?.Descriptor ?? null,
      },
    })
  } catch (error) {
    logger.error(`[${requestId}] Workday create prehire failed`, { error })
    return NextResponse.json(
      { success: false, error: getErrorMessage(error, 'Unknown error') },
      { status: 500 }
    )
  }
})
