import { NextRequest, NextResponse } from 'next/server';
import { cookies } from 'next/headers';

export interface ApiRouteContext {
  params: Record<string, string>;
  token?: string;
  user?: any;
}

export interface ApiError extends Error {
  status?: number;
  errors?: Record<string, string[]>;
}

/**
 * Wrapper for API routes with error handling and auth
 * Automatically handles authentication and provides clean error responses
 */
export function createApiRoute<T = any>(
  handler: (req: NextRequest, context: ApiRouteContext) => Promise<T>
) {
  return async (
    req: NextRequest,
    { params }: { params: Promise<Record<string, string>> }
  ) => {
    try {
      const cookieStore = await cookies();
      const token = cookieStore.get('token')?.value;
      const userCookie = cookieStore.get('getUser')?.value;
      const resolvedParams = await params;

      let user = null;
      if (userCookie) {
        try {
          user = JSON.parse(userCookie);
        } catch (e) {
          console.error('Failed to parse user cookie:', e);
        }
      }

      const result = await handler(req, {
        params: resolvedParams,
        token,
        user,
      });

      return NextResponse.json(result);
    } catch (error: any) {
      console.error('API Route Error:', error);
      
      const status = error.status || 500;
      const message = error.message || 'Internal Server Error';
      const errors = error.errors;

      return NextResponse.json(
        { 
          success: false,
          message,
          ...(errors && { errors }),
        },
        { status }
      );
    }
  };
}

/**
 * Require authentication proxy
 * Throws 401 error if no token is present
 */
export function requireAuth(
  handler: (req: NextRequest, context: ApiRouteContext) => Promise<any>
) {
  return async (req: NextRequest, context: ApiRouteContext) => {
    if (!context.token) {
      const error: ApiError = new Error('Unauthorized - Please login');
      error.status = 401;
      throw error;
    }
    return handler(req, context);
  };
}

/**
 * Create an API error with custom status and errors
 */
export function createApiError(
  message: string,
  status: number = 400,
  errors?: Record<string, string[]>
): ApiError {
  const error: ApiError = new Error(message);
  error.status = status;
  error.errors = errors;
  return error;
}
