import { NextResponse } from 'next/server';
import { dailyService } from '@/services/task-management/daily';
import {
  getToday,
  parseDate,
  isValidAPIDate,
  createDateFromParts,
} from '@/lib/date-utils';
import { getServerSession } from 'next-auth/next';
import { authOptions } from '@/lib/auth';

/**
 * API route pour récupérer la vue daily (hier + aujourd'hui)
 */
export async function GET(request: Request) {
  try {
    const session = await getServerSession(authOptions);
    if (!session?.user?.id) {
      return NextResponse.json({ error: 'Non authentifié' }, { status: 401 });
    }

    const { searchParams } = new URL(request.url);

    const action = searchParams.get('action');
    const date = searchParams.get('date');

    if (action === 'history') {
      // Récupérer l'historique
      const limit = parseInt(searchParams.get('limit') || '30');
      const history = await dailyService.getCheckboxHistory(
        session.user.id,
        limit
      );
      return NextResponse.json(history);
    }

    if (action === 'search') {
      // Recherche dans les checkboxes
      const query = searchParams.get('q') || '';
      const limit = parseInt(searchParams.get('limit') || '20');

      if (!query.trim()) {
        return NextResponse.json(
          { error: 'Query parameter required' },
          { status: 400 }
        );
      }

      const checkboxes = await dailyService.searchCheckboxes(query, limit);
      return NextResponse.json(checkboxes);
    }

    // Vue daily pour une date donnée (ou aujourd'hui par défaut)
    let targetDate: Date;

    if (date) {
      if (!isValidAPIDate(date)) {
        return NextResponse.json(
          { error: 'Format de date invalide. Utilisez YYYY-MM-DD' },
          { status: 400 }
        );
      }
      targetDate = parseDate(date);
    } else {
      targetDate = getToday();
    }

    const dailyView = await dailyService.getDailyView(
      targetDate,
      session.user.id
    );
    return NextResponse.json(dailyView);
  } catch (error) {
    console.error('Erreur lors de la récupération du daily:', error);
    return NextResponse.json(
      { error: 'Erreur interne du serveur' },
      { status: 500 }
    );
  }
}

/**
 * API route pour ajouter une checkbox
 */
export async function POST(request: Request) {
  try {
    const session = await getServerSession(authOptions);
    if (!session?.user?.id) {
      return NextResponse.json({ error: 'Non authentifié' }, { status: 401 });
    }
    const body = await request.json();

    // Validation des données
    if (!body.date || !body.text) {
      return NextResponse.json(
        { error: 'Date et text sont requis' },
        { status: 400 }
      );
    }

    // Parser la date de façon plus robuste
    let date: Date;
    if (typeof body.date === 'string') {
      // Si c'est une string YYYY-MM-DD, créer une date locale
      const [year, month, day] = body.date.split('-').map(Number);
      date = createDateFromParts(year, month, day);
    } else {
      date = parseDate(body.date);
    }

    if (isNaN(date.getTime())) {
      return NextResponse.json(
        { error: 'Format de date invalide. Utilisez YYYY-MM-DD' },
        { status: 400 }
      );
    }

    const checkbox = await dailyService.addCheckbox({
      date,
      userId: session.user.id,
      text: body.text,
      type: body.type,
      taskId: body.taskId,
      order: body.order,
      isChecked: body.isChecked,
    });

    return NextResponse.json(checkbox, { status: 201 });
  } catch (error) {
    console.error("Erreur lors de l'ajout de la checkbox:", error);
    return NextResponse.json(
      { error: 'Erreur interne du serveur' },
      { status: 500 }
    );
  }
}
