import { NextRequest, NextResponse } from 'next/server';
import { prisma } from '@/lib/prisma';
import { requireAuthenticatedUser, unauthorizedResponse } from '@/lib/api-auth';

export async function GET(req: NextRequest) {
    try {
        const session = await requireAuthenticatedUser();
        if (!session) return unauthorizedResponse();

        const journeys = await prisma.journey.findMany({
            orderBy: { createdAt: 'desc' },
            include: {
                user: { select: { id: true, name: true } },
                photos: {
                    orderBy: { order: 'asc' },
                    take: 6,
                },
                stops: {
                    orderBy: { order: 'asc' },
                    include: {
                        photos: {
                            orderBy: { order: 'asc' },
                            take: 4,
                        },
                    },
                },
            },
        });

        return NextResponse.json({ journeys });
    } catch (error) {
        console.error('Journeys GET error:', error);
        return NextResponse.json({ error: 'Internal server error' }, { status: 500 });
    }
}

export async function POST(req: NextRequest) {
    try {
        const session = await requireAuthenticatedUser();
        if (!session) return unauthorizedResponse();

        // All authenticated users can create journeys

        const body = await req.json();
        const { title, description, startDate, endDate } = body;

        if (!title || typeof title !== 'string' || title.trim().length === 0) {
            return NextResponse.json({ error: 'Title is required' }, { status: 400 });
        }
        if (title.length > 200) {
            return NextResponse.json({ error: 'Title must be 200 characters or less' }, { status: 400 });
        }

        const maxOrder = await prisma.journey.aggregate({ _max: { order: true } });
        const newOrder = (maxOrder._max.order ?? -1) + 1;

        const journey = await prisma.journey.create({
            data: {
                title: title.trim(),
                description: description || null,
                startDate: startDate ? new Date(startDate) : null,
                endDate: endDate ? new Date(endDate) : null,
                userId: session.user.id,
                order: newOrder,
            },
            include: {
                user: { select: { id: true, name: true } },
                stops: true,
            },
        });

        return NextResponse.json(journey, { status: 201 });
    } catch (error) {
        console.error('Journey POST error:', error);
        return NextResponse.json({ error: 'Internal server error' }, { status: 500 });
    }
}
