import { NextRequest, NextResponse } from "next/server";
import { prisma } from "@/infrastructure/db/prisma";
import { checkRateLimit } from "@/lib/rate-limiter";

interface CrisisEvaluationRequest {
  message: string;
  patientPhone?: string;
}

interface CrisisKeywords {
  keywords: string[];
  score: number;
  response: string;
  urgent: boolean;
}

const crisisKeywords: CrisisKeywords[] = [
  {
    keywords: ["suicidio", "matarme", "morir", "muero", "quitarme la vida"],
    score: 100,
    response:
      "Si estás pensando en suicidarte, por favor llama inmediatamente al 911 o acude a la sala de urgencias más cercana. Tu vida importa.",
    urgent: true,
  },
  {
    keywords: ["muero morir", "ya no puedo más", "no aguanto más", "es mucho", "no puedo soportar"],
    score: 80,
    response:
      "Entiendo que estás pasando por un momento muy difícil. Por favor contáctame a través de WhatsApp para recibir apoyo inmediato.",
    urgent: true,
  },
  {
    keywords: ["ansiedad", "pánico", "ataque de pánico", "ansiedad severa", "nerviosismo"],
    score: 60,
    response:
      "Es normal sentir ansiedad ante situaciones difíciles. Podemos trabajar juntos para manejar estos sentimientos de forma saludable.",
    urgent: false,
  },
  {
    keywords: ["deprimido", "triste", "tristeza", "melancolía", "no tengo ánimo"],
    score: 50,
    response: "La tristeza es una emoción válida y necesaria. Te acompaño en este proceso.",
    urgent: false,
  },
  {
    keywords: ["duelo", "pérdida", "extrañar", "murió", "falleció", "se fue"],
    score: 70,
    response:
      "El proceso de duelo puede ser muy doloroso. Estoy aquí para apoyarte durante este tiempo.",
    urgent: false,
  },
];

export async function POST(request: NextRequest) {
  try {
    const body = (await request.json()) as CrisisEvaluationRequest;

    if (!body.message || body.message.trim().length === 0) {
      return NextResponse.json({ error: "Message is required" }, { status: 400 });
    }

    const ip =
      request.ip ||
      request.headers.get("x-forwarded-for")?.split(",")[0] ||
      request.headers.get("x-real-ip") ||
      "unknown";

    // Check rate limit by IP
    const ipLimit = await checkRateLimit(ip, "ip");
    if (!ipLimit.success) {
      return NextResponse.json(
        {
          error: "Too many requests",
          limit: ipLimit.limit,
          remaining: ipLimit.remaining,
          resetTime: ipLimit.resetTime,
        },
        {
          status: 429,
          headers: {
            "X-RateLimit-Limit": ipLimit.limit.toString(),
            "X-RateLimit-Remaining": ipLimit.remaining.toString(),
            "X-RateLimit-Reset": ipLimit.resetTime.toISOString(),
            "Retry-After": Math.ceil((ipLimit.resetTime.getTime() - Date.now()) / 1000).toString(),
          },
        }
      );
    }

    // Check rate limit by phone if provided
    if (body.patientPhone) {
      const phoneLimit = await checkRateLimit(body.patientPhone, "phone");
      if (!phoneLimit.success) {
        return NextResponse.json(
          {
            error: "Too many requests for this phone number",
            limit: phoneLimit.limit,
            remaining: phoneLimit.remaining,
            resetTime: phoneLimit.resetTime,
          },
          {
            status: 429,
            headers: {
              "X-RateLimit-Limit": phoneLimit.limit.toString(),
              "X-RateLimit-Remaining": phoneLimit.remaining.toString(),
              "X-RateLimit-Reset": phoneLimit.resetTime.toISOString(),
              "Retry-After": Math.ceil(
                (phoneLimit.resetTime.getTime() - Date.now()) / 1000
              ).toString(),
            },
          }
        );
      }
    }

    // Evaluate crisis level
    const evaluation = evaluateCrisisLevel(body.message.toLowerCase());

    // If urgent and patient phone provided, notify therapist
    if (evaluation.urgent && body.patientPhone) {
      // TODO: Send notification to therapist via WhatsApp
      console.log(`Crisis detected for patient ${body.patientPhone}: ${evaluation.score}`);

      // Log to database for follow-up
      if (body.patientPhone) {
        const patient = await prisma.patient.findUnique({
          where: { phone: body.patientPhone },
          select: { name: true },
        });

        if (patient) {
          // Could log crisis event to a new table
          console.log(`Crisis evaluation logged for patient: ${patient.name}`);
        }
      }
    }

    // Rate limit headers for successful response
    const headers = {
      "X-RateLimit-Limit": ipLimit.limit.toString(),
      "X-RateLimit-Remaining": ipLimit.remaining.toString(),
      "X-RateLimit-Reset": ipLimit.resetTime.toISOString(),
    };

    return NextResponse.json(
      {
        success: true,
        evaluation: {
          score: evaluation.score,
          level: getLevelFromScore(evaluation.score),
          urgent: evaluation.urgent,
          matchedKeywords: evaluation.matchedKeywords,
        },
        message: evaluation.response,
        recommendations: evaluation.recommendations,
      },
      { headers }
    );
  } catch (error) {
    console.error("Crisis evaluation error:", error);
    return NextResponse.json({ error: "Internal server error" }, { status: 500 });
  }
}

function evaluateCrisisLevel(message: string) {
  let maxScore = 0;
  const matchedKeywords: string[] = [];

  for (const keywordGroup of crisisKeywords) {
    for (const keyword of keywordGroup.keywords) {
      if (message.includes(keyword)) {
        maxScore = Math.max(maxScore, keywordGroup.score);
        matchedKeywords.push(keyword);
      }
    }
  }

  const result = crisisKeywords.find((k) => k.score === maxScore) || crisisKeywords[0];

  return {
    matchedKeywords: [...new Set(matchedKeywords)],
    ...result,
    recommendations: generateRecommendations(maxScore),
  };
}

function getLevelFromScore(score: number): "low" | "medium" | "high" | "severe" {
  if (score >= 100) return "severe";
  if (score >= 80) return "high";
  if (score >= 50) return "medium";
  return "low";
}

function generateRecommendations(score: number): string[] {
  const recommendations: string[] = [];

  if (score >= 100) {
    recommendations.push("Llama inmediatamente al 911");
    recommendations.push("Acude a la sala de urgencias más cercana");
    recommendations.push("Contacta a un familiar o amigo de confianza");
  } else if (score >= 80) {
    recommendations.push("Contacta vía WhatsApp para recibir apoyo inmediato");
    recommendations.push("Agenda una sesión lo antes posible");
    recommendations.push("No te quedes sola con estos sentimientos");
  } else if (score >= 50) {
    recommendations.push("Agenda una sesión pronto");
    recommendations.push("Practica ejercicios de respiración");
    recommendations.push("Habla con alguien de tu confianza");
  } else {
    recommendations.push("Continúa con tu proceso terapéutico normal");
    recommendations.push("Estoy disponible para apoyarte cuando lo necesites");
  }

  return recommendations;
}
