import { NextRequest, NextResponse } from 'next/server';
import { userPreferencesService } from '@/services/core/user-preferences';
import { JiraConfig } from '@/lib/types';
import { getServerSession } from 'next-auth';
import { authOptions } from '@/lib/auth';

/**
 * GET /api/user-preferences/jira-config
 * Récupère la configuration Jira
 */
export async function GET() {
  try {
    const session = await getServerSession(authOptions);
    if (!session?.user?.id) {
      return NextResponse.json({ error: 'Non authentifié' }, { status: 401 });
    }

    const jiraConfig = await userPreferencesService.getJiraConfig(
      session.user.id
    );
    return NextResponse.json({ jiraConfig });
  } catch (error) {
    console.error('Erreur lors de la récupération de la config Jira:', error);
    return NextResponse.json(
      { error: 'Erreur lors de la récupération de la configuration Jira' },
      { status: 500 }
    );
  }
}

/**
 * PUT /api/user-preferences/jira-config
 * Sauvegarde la configuration Jira
 */
export async function PUT(request: NextRequest) {
  try {
    const session = await getServerSession(authOptions);
    if (!session?.user?.id) {
      return NextResponse.json({ error: 'Non authentifié' }, { status: 401 });
    }

    const body = await request.json();
    const { baseUrl, email, apiToken, projectKey, ignoredProjects } = body;

    // Validation des données requises
    if (!baseUrl || !email || !apiToken) {
      return NextResponse.json(
        { error: 'baseUrl, email et apiToken sont requis' },
        { status: 400 }
      );
    }

    // Validation du format URL
    try {
      new URL(baseUrl);
    } catch {
      return NextResponse.json(
        { error: 'baseUrl doit être une URL valide' },
        { status: 400 }
      );
    }

    // Validation du format email
    const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
    if (!emailRegex.test(email)) {
      return NextResponse.json(
        { error: 'email doit être un email valide' },
        { status: 400 }
      );
    }

    const jiraConfig: JiraConfig = {
      baseUrl: baseUrl.trim(),
      email: email.trim(),
      apiToken: apiToken.trim(),
      enabled: true,
      projectKey: projectKey ? projectKey.trim().toUpperCase() : undefined,
      ignoredProjects: Array.isArray(ignoredProjects)
        ? ignoredProjects
            .map((p: string) => p.trim().toUpperCase())
            .filter((p: string) => p.length > 0)
        : [],
    };

    await userPreferencesService.saveJiraConfig(session.user.id, jiraConfig);

    return NextResponse.json({
      success: true,
      message: 'Configuration Jira sauvegardée avec succès',
      jiraConfig: {
        ...jiraConfig,
        apiToken: '••••••••', // Masquer le token dans la réponse
      },
    });
  } catch (error) {
    console.error('Erreur lors de la sauvegarde de la config Jira:', error);
    return NextResponse.json(
      { error: 'Erreur lors de la sauvegarde de la configuration Jira' },
      { status: 500 }
    );
  }
}

/**
 * DELETE /api/user-preferences/jira-config
 * Supprime la configuration Jira (remet à zéro)
 */
export async function DELETE() {
  try {
    const session = await getServerSession(authOptions);
    if (!session?.user?.id) {
      return NextResponse.json({ error: 'Non authentifié' }, { status: 401 });
    }

    const defaultConfig: JiraConfig = {
      baseUrl: '',
      email: '',
      apiToken: '',
      enabled: false,
      ignoredProjects: [],
    };

    await userPreferencesService.saveJiraConfig(session.user.id, defaultConfig);

    return NextResponse.json({
      success: true,
      message: 'Configuration Jira réinitialisée avec succès',
    });
  } catch (error) {
    console.error('Erreur lors de la suppression de la config Jira:', error);
    return NextResponse.json(
      { error: 'Erreur lors de la suppression de la configuration Jira' },
      { status: 500 }
    );
  }
}
