import { NextRequest } from "next/server";
import { getServerSession } from "next-auth/next";
import { authOptions } from "@/lib/auth";
import { RecordingService } from "@/lib/services/recording.service";
import { ApiResponseHandler } from "@/lib/utils/api-response";
import {
  AuthenticationError,
  NotFoundError,
  ValidationError,
} from "@/lib/errors/app-error";

export async function PUT(
  request: NextRequest,
  { params }: { params: Promise<{ id: string }> }
) {
  try {
    const session = await getServerSession(authOptions);

    if (!session?.user?.id) {
      throw new AuthenticationError();
    }

    const { id } = await params;

    if (!id) {
      throw new NotFoundError("录音ID不能为空");
    }

    const body = await request.json();
    const { title } = body;

    console.log(`PUT /api/recordings/${id} - 请求数据:`, {
      title,
      userId: session.user.id,
    });

    if (!title || typeof title !== "string" || title.trim().length === 0) {
      throw new ValidationError("录音标题不能为空");
    }

    if (title.length > 100) {
      throw new ValidationError("录音标题不能超过100个字符");
    }

    console.log(
      `Attempting to update recording: ${id} for user: ${
        session.user.id
      } with title: "${title.trim()}"`
    );

    const updatedRecording = await RecordingService.updateRecording(
      id,
      session.user.id,
      { title: title.trim() }
    );

    console.log(
      `Successfully updated recording: ${id}, new title: "${updatedRecording.title}"`
    );

    return ApiResponseHandler.success(updatedRecording);
  } catch (error) {
    console.error(`Failed to update recording ${params}:`, error);
    return ApiResponseHandler.error(error as Error);
  }
}

export async function DELETE(
  request: NextRequest,
  { params }: { params: Promise<{ id: string }> }
) {
  try {
    const session = await getServerSession(authOptions);

    if (!session?.user?.id) {
      throw new AuthenticationError();
    }

    const { id } = await params;

    if (!id) {
      throw new NotFoundError("录音ID不能为空");
    }

    console.log(
      `Attempting to delete recording: ${id} for user: ${session.user.id}`
    );

    await RecordingService.deleteRecording(id, session.user.id);

    console.log(`Successfully deleted recording: ${id}`);

    return ApiResponseHandler.noContent();
  } catch (error) {
    console.error(`Failed to delete recording ${params}:`, error);
    return ApiResponseHandler.error(error as Error);
  }
}
