import { NextResponse } from "next/server";
import { authenticateDeveloperRequest } from "@/lib/developers/auth";
import { emitWorkspaceWebhookEvent } from "@/lib/developers/webhooks";
import { sql } from "@/lib/db/postgres";
import { censorText } from "@/lib/content-filter";

function normalizeLeadStatus(value: unknown) {
  return value === "neu" ||
    value === "kontaktiert" ||
    value === "angebot" ||
    value === "gewonnen" ||
    value === "verloren"
    ? value
    : "neu";
}

function normalizeLeadScore(value: unknown) {
  return value === "cold" || value === "warm" || value === "hot" ? value : "warm";
}

function stringOrNull(value: unknown) {
  return typeof value === "string" && value.trim() ? value.trim() : null;
}

export async function GET(req: Request) {
  const auth = await authenticateDeveloperRequest(req, { section: "leads" });
  if (!auth) {
    return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
  }

  const url = new URL(req.url);
  const limit = Math.min(Math.max(Number(url.searchParams.get("limit") || 50), 1), 100);
  const status = url.searchParams.get("status");
  const source = url.searchParams.get("source");

  let leads: Record<string, unknown>[];

  if (auth.workspaceTeamId) {
    if (status && source) {
      const { rows } = await sql`
        SELECT * FROM leads
        WHERE team_id = ${auth.workspaceTeamId}
          AND status = ${status}
          AND source = ${source}
        ORDER BY created_at DESC
        LIMIT ${limit}
      `;
      leads = rows;
    } else if (status) {
      const { rows } = await sql`
        SELECT * FROM leads
        WHERE team_id = ${auth.workspaceTeamId}
          AND status = ${status}
        ORDER BY created_at DESC
        LIMIT ${limit}
      `;
      leads = rows;
    } else if (source) {
      const { rows } = await sql`
        SELECT * FROM leads
        WHERE team_id = ${auth.workspaceTeamId}
          AND source = ${source}
        ORDER BY created_at DESC
        LIMIT ${limit}
      `;
      leads = rows;
    } else {
      const { rows } = await sql`
        SELECT * FROM leads
        WHERE team_id = ${auth.workspaceTeamId}
        ORDER BY created_at DESC
        LIMIT ${limit}
      `;
      leads = rows;
    }
  } else {
    if (status && source) {
      const { rows } = await sql`
        SELECT * FROM leads
        WHERE team_id IS NULL
          AND user_id = ${auth.workspaceUserId}
          AND status = ${status}
          AND source = ${source}
        ORDER BY created_at DESC
        LIMIT ${limit}
      `;
      leads = rows;
    } else if (status) {
      const { rows } = await sql`
        SELECT * FROM leads
        WHERE team_id IS NULL
          AND user_id = ${auth.workspaceUserId}
          AND status = ${status}
        ORDER BY created_at DESC
        LIMIT ${limit}
      `;
      leads = rows;
    } else if (source) {
      const { rows } = await sql`
        SELECT * FROM leads
        WHERE team_id IS NULL
          AND user_id = ${auth.workspaceUserId}
          AND source = ${source}
        ORDER BY created_at DESC
        LIMIT ${limit}
      `;
      leads = rows;
    } else {
      const { rows } = await sql`
        SELECT * FROM leads
        WHERE team_id IS NULL
          AND user_id = ${auth.workspaceUserId}
        ORDER BY created_at DESC
        LIMIT ${limit}
      `;
      leads = rows;
    }
  }

  return NextResponse.json({ leads });
}

export async function POST(req: Request) {
  const auth = await authenticateDeveloperRequest(req, { write: true, section: "leads" });
  if (!auth) {
    return NextResponse.json({ error: "Unauthorized" }, { status: 401 });
  }

  const body = await req.json().catch(() => null);
  const name = stringOrNull(body?.name);
  const email = stringOrNull(body?.email);
  const phone = stringOrNull(body?.phone);

  if (!name && !email && !phone) {
    return NextResponse.json({ error: "Lead needs at least name, email, or phone" }, { status: 400 });
  }

  const company = stringOrNull(body?.company);
  const category = stringOrNull(body?.category) || "Website";
  const status = normalizeLeadStatus(body?.status);
  const score = normalizeLeadScore(body?.score);
  const source = stringOrNull(body?.source) || "website_api";
  const notes = stringOrNull(body?.notes) ? censorText(stringOrNull(body?.notes)!) : null;
  const value =
    typeof body?.value === "number" && Number.isFinite(body.value)
      ? body.value
      : typeof body?.value === "string" && body.value.trim()
        ? Number.parseFloat(body.value.replace(",", "."))
        : null;

  let lead: Record<string, unknown>;
  try {
    const { rows } = await sql`
      INSERT INTO leads (
        user_id, team_id, name, email, phone, company,
        category, status, score, source, value, notes
      )
      VALUES (
        ${auth.workspaceUserId},
        ${auth.workspaceTeamId},
        ${name || email || phone || "Website Lead"},
        ${email},
        ${phone},
        ${company},
        ${category},
        ${status},
        ${score},
        ${source},
        ${Number.isFinite(value) ? value : null},
        ${notes}
      )
      RETURNING *
    `;
    lead = rows[0];
  } catch (error) {
    const message = error instanceof Error ? error.message : "Lead could not be created";
    return NextResponse.json({ error: message }, { status: 400 });
  }

  await emitWorkspaceWebhookEvent({
    actorId: auth.workspaceUserId,
    data: {
      lead,
      source: "developer_api",
    },
    eventType: "lead.created",
    teamId: auth.workspaceTeamId,
    userId: auth.workspaceUserId,
  });

  return NextResponse.json({ lead }, { status: 201 });
}
