import { NextRequest, NextResponse } from "next/server";
import { writeFile, readFile, mkdir } from "fs/promises";
import { existsSync } from "fs";
import path from "path";
import { Client, ClientInput } from "@/lib/types/client";

// Mot de passe admin (à changer en production via variable d'environnement)
const ADMIN_PASSWORD = process.env.ADMIN_PASSWORD || "admin123";

// Chemin vers le fichier de stockage
const DATA_DIR = path.join(process.cwd(), "data");
const CLIENTS_FILE = path.join(DATA_DIR, "clients.json");

// Vérifier l'authentification
function verifyAuth(request: NextRequest): boolean {
  const authHeader = request.headers.get("authorization");
  if (!authHeader) return false;
  
  const token = authHeader.replace("Bearer ", "");
  return token === ADMIN_PASSWORD;
}

// Charger les clients depuis le fichier
async function loadClients(): Promise<Client[]> {
  try {
    if (!existsSync(CLIENTS_FILE)) {
      // Créer le répertoire et le fichier si nécessaire
      if (!existsSync(DATA_DIR)) {
        await mkdir(DATA_DIR, { recursive: true });
      }
      await writeFile(CLIENTS_FILE, JSON.stringify([], null, 2));
      return [];
    }
    
    const data = await readFile(CLIENTS_FILE, "utf-8");
    return JSON.parse(data);
  } catch (error) {
    console.error("Erreur lecture clients:", error);
    return [];
  }
}

// Sauvegarder les clients dans le fichier
async function saveClients(clients: Client[]): Promise<void> {
  try {
    if (!existsSync(DATA_DIR)) {
      await mkdir(DATA_DIR, { recursive: true });
    }
    await writeFile(CLIENTS_FILE, JSON.stringify(clients, null, 2));
  } catch (error) {
    console.error("Erreur sauvegarde clients:", error);
    throw error;
  }
}

// GET - Récupérer tous les clients
export async function GET(request: NextRequest) {
  if (!verifyAuth(request)) {
    return NextResponse.json({ error: "Non autorisé" }, { status: 401 });
  }

  try {
    const clients = await loadClients();
    return NextResponse.json(clients);
  } catch (error) {
    console.error("Erreur GET clients:", error);
    return NextResponse.json(
      { error: "Erreur serveur" },
      { status: 500 }
    );
  }
}

// POST - Créer un nouveau client
export async function POST(request: NextRequest) {
  if (!verifyAuth(request)) {
    return NextResponse.json({ error: "Non autorisé" }, { status: 401 });
  }

  try {
    const input: ClientInput = await request.json();
    
    // Validation
    if (!input.email || !input.bungalowNumber) {
      return NextResponse.json(
        { error: "Email et numéro de bungalow requis" },
        { status: 400 }
      );
    }

    const clients = await loadClients();
    
    // Vérifier si l'email existe déjà
    if (clients.some(c => c.email === input.email)) {
      return NextResponse.json(
        { error: "Un client avec cet email existe déjà" },
        { status: 409 }
      );
    }

    // Créer le nouveau client
    const newClient: Client = {
      id: `client-${Date.now()}`,
      token: generateToken(),
      email: input.email,
      bungalowNumber: input.bungalowNumber,
      wifiName: input.wifiName || "Lagon-WiFi",
      wifiPassword: input.wifiPassword || "",
      gerantMessage: input.gerantMessage || "Bienvenue dans notre pension de famille !",
      createdAt: new Date().toISOString(),
    };

    clients.push(newClient);
    await saveClients(clients);

    return NextResponse.json(newClient, { status: 201 });
  } catch (error) {
    console.error("Erreur POST client:", error);
    return NextResponse.json(
      { error: "Erreur serveur" },
      { status: 500 }
    );
  }
}

// Générer un token unique
function generateToken(): string {
  return Math.random().toString(36).substring(2, 15) + 
         Math.random().toString(36).substring(2, 15);
}

