"use client";

import { useState } from "react";
import { motion, AnimatePresence } from "framer-motion";
import toast, { Toaster } from "react-hot-toast";
import Link from "next/link";
import { useRouter } from "next/navigation";
import {
  Mail,
  Lock,
  Eye,
  EyeOff,
  ArrowLeft,
  LogIn,
  CheckCircle,
  Loader2,
  Home,
  Shield,
  Phone,
  KeyRound,
} from "lucide-react";
import {
  loginWithEmail,
  loginWithPhone,
  sendEmailOTP,
  sendPhoneOTP,
  verifyEmail,
  verifyPhone,
  isEmail,
  isPhoneNumber,
  getOwnerByUserId,
  getCustomerByUserId,
} from "../utils/api";
import AuthService from "../services/AuthService";

export default function LoginPage() {
  const router = useRouter();

  // Step: 'login' | 'otp'
  const [step, setStep] = useState("login");
  const [loginMethod, setLoginMethod] = useState("email"); // 'email' | 'phone'
  const [showPassword, setShowPassword] = useState(false);
  const [isLoading, setIsLoading] = useState(false);
  const [isSuccess, setIsSuccess] = useState(false);

  const [formData, setFormData] = useState({
    credential: "",
    password: "",
    rememberMe: false,
  });

  const [otpCode, setOtpCode] = useState("");
  const [otpError, setOtpError] = useState("");
  const [errors, setErrors] = useState({});

  const validateForm = () => {
    const newErrors = {};

    if (!formData.credential) {
      newErrors.credential =
        loginMethod === "email"
          ? "البريد الإلكتروني مطلوب"
          : "رقم الهاتف مطلوب";
      // } else if (loginMethod === 'email' && !isEmail(formData.credential)) {
      //   newErrors.credential = 'البريد الإلكتروني غير صالح';
      // } else if (loginMethod === 'phone' && !isPhoneNumber(formData.credential)) {
      newErrors.credential = "رقم الهاتف غير صالح";
    }

    if (!formData.password) {
      newErrors.password = "كلمة المرور مطلوبة";
    }

    setErrors(newErrors);
    return Object.keys(newErrors).length === 0;
  };

  const handleLogin = async (e) => {
    e.preventDefault();
    if (!validateForm()) return;

    setIsLoading(true);
    setErrors({});

    try {
      const loginFn = loginMethod === "email" ? loginWithEmail : loginWithPhone;
      console.log(
        "[Login] Attempting login via",
        loginMethod,
        ":",
        formData.credential,
      );

      const result = await loginFn(formData.credential, formData.password);

      console.log("[Login] Response status:", result.status);

      if (result.status === 200) {
        const token =
          typeof result.data === "string"
            ? result.data
            : result.data?.token || result.data?.accessToken;
        AuthService.addToken(token);
        console.log("[Login] Token stored");

        // Fetch user profile to get full name
        const authUser = AuthService.getUser();
        if (authUser?.id) {
          try {
            const isOwner = AuthService.isOwner();
            const fetchFn = isOwner ? getOwnerByUserId : getCustomerByUserId;
            const profile = await fetchFn(authUser.id);
            if (profile) {
              AuthService.cacheUser({
                name:
                  profile.fullName ||
                  profile.name ||
                  `${profile.firstName || ""} ${profile.lastName || ""}`.trim(),
                email: profile.email || authUser.email,
                phone: profile.phone || profile.phoneNumber || authUser.phone,
              });
              console.log("[Login] User profile cached");
            }
          } catch (err) {
            console.warn("[Login] Failed to fetch profile:", err);
          }
        }

        const userRole = AuthService.isOwner() ? "owner" : "customer";
        console.log("[Login] User role:", userRole);

        setIsSuccess(true);
        toast.success("تم تسجيل الدخول بنجاح!", {
          style: { background: "#dcfce7", color: "#166534" },
        });

        setTimeout(() => {
          router.push("/");
        }, 1500);
      } else if (result.status === 206) {
        console.log("[Login] 206 — OTP required");
        const tempToken =
          typeof result.data === "string"
            ? result.data
            : result.data?.token || result.data?.accessToken;
        if (tempToken) {
          AuthService.addToken(tempToken);
          console.log("[Login] Temp token stored for OTP");
        }
        toast("يرجى إدخال رمز التحقق", {
          icon: "🔐",
          style: { background: "#fef3c7", color: "#92400e" },
        });

        // Send OTP
        try {
          if (loginMethod === "email") {
            await sendEmailOTP();
          } else {
            await sendPhoneOTP();
          }
          console.log("[Login] OTP sent successfully");
        } catch (otpErr) {
          console.warn("[Login] OTP send failed, proceeding anyway:", otpErr);
        }

        setStep("otp");
      } else {
        // Other error
        console.error("[Login] Unexpected status:", result.status, result.data);
        toast.error(
          result.data?.message || result.data || "بيانات الدخول غير صحيحة",
          {
            style: { background: "#fee2e2", color: "#991b1b" },
          },
        );
      }
    } catch (err) {
      console.error("[Login] Error:", err);
      toast.error(err.message || "حدث خطأ في الاتصال", {
        style: { background: "#fee2e2", color: "#991b1b" },
      });
    } finally {
      setIsLoading(false);
    }
  };

  const handleVerifyOTP = async (e) => {
    e.preventDefault();
    if (!otpCode || otpCode.length < 4) {
      setOtpError("يرجى إدخال رمز التحقق");
      return;
    }

    setIsLoading(true);
    setOtpError("");

    try {
      const verifyFn = loginMethod === "email" ? verifyEmail : verifyPhone;
      console.log("[OTP] Verifying code:", otpCode);

      const result = await verifyFn(otpCode);
      console.log("[OTP] Verify response status:", result.status);

      if (result.ok) {
        const finalToken =
          typeof result.data === "string"
            ? result.data
            : result.data?.token || result.data?.accessToken;
        if (finalToken && typeof finalToken === "string") {
          AuthService.addToken(finalToken);
          console.log("[OTP] Final token stored");
        }

        setIsSuccess(true);
        toast.success("تم التحقق بنجاح!", {
          style: { background: "#dcfce7", color: "#166534" },
        });

        setTimeout(() => {
          console.log("[OTP] Redirecting to home");
          router.push("/");
        }, 1500);
      } else {
        console.error("[OTP] Verification failed:", result.data);
        setOtpError(result.data?.message || "رمز التحقق غير صحيح");
      }
    } catch (err) {
      console.error("[OTP] Error:", err);
      setOtpError(err.message || "حدث خطأ في التحقق");
    } finally {
      setIsLoading(false);
    }
  };

  const resendOTP = async () => {
    try {
      console.log("[OTP] Resending OTP via", loginMethod);
      if (loginMethod === "email") {
        await sendEmailOTP();
      } else {
        await sendPhoneOTP();
      }
      toast.success("تم إرسال رمز التحقق مجدداً", {
        style: { background: "#dcfce7", color: "#166534" },
      });
    } catch (err) {
      console.error("[OTP] Resend failed:", err);
      toast.error("فشل إرسال الرمز");
    }
  };

  // Auto-detect login method from input
  const handleCredentialChange = (value) => {
    setFormData({ ...formData, credential: value });
    if (errors.credential) setErrors({ ...errors, credential: null });

    // Auto-switch method
    // if (isEmail(value)) {
    //   setLoginMethod('email');
    // } else if (isPhoneNumber(value)) {
    //   setLoginMethod('phone');
    // }
  };

  const particles = Array.from({ length: 20 }, (_, i) => ({
    id: i,
    x: Math.random() * 100,
    y: Math.random() * 100,
    size: Math.random() * 3 + 1,
    duration: Math.random() * 15 + 10,
    delay: Math.random() * 5,
  }));

  const containerVariants = {
    hidden: { opacity: 0 },
    visible: {
      opacity: 1,
      transition: { staggerChildren: 0.1, delayChildren: 0.2 },
    },
  };

  const itemVariants = {
    hidden: { y: 20, opacity: 0 },
    visible: {
      y: 0,
      opacity: 1,
      transition: { type: "spring", stiffness: 100 },
    },
  };

  return (
    <div className="min-h-screen bg-gradient-to-br from-gray-950 via-gray-900 to-gray-950 flex items-center justify-center p-4 relative overflow-hidden">
      <Toaster position="top-center" reverseOrder={false} />

      {/* Particles */}
      <div className="absolute inset-0 overflow-hidden">
        {particles.map((p) => (
          <motion.div
            key={p.id}
            className="absolute rounded-full bg-amber-500/20"
            style={{
              left: `${p.x}%`,
              top: `${p.y}%`,
              width: p.size,
              height: p.size,
            }}
            animate={{
              y: [0, -20, 0],
              x: [0, 10, -10, 0],
              opacity: [0.2, 0.4, 0.2],
            }}
            transition={{
              duration: p.duration,
              repeat: Infinity,
              delay: p.delay,
              ease: "linear",
            }}
          />
        ))}
      </div>

      {/* Glow orbs */}
      <motion.div
        className="absolute top-20 left-20 w-64 h-64 bg-amber-500/10 rounded-full blur-3xl"
        animate={{ scale: [1, 1.2, 1], x: [0, 30, 0], y: [0, -20, 0] }}
        transition={{ duration: 12, repeat: Infinity }}
      />
      <motion.div
        className="absolute bottom-20 right-20 w-80 h-80 bg-blue-500/10 rounded-full blur-3xl"
        animate={{ scale: [1, 1.3, 1], x: [0, -30, 0], y: [0, 20, 0] }}
        transition={{ duration: 15, repeat: Infinity }}
      />

      <motion.div
        variants={containerVariants}
        initial="hidden"
        animate="visible"
        className="relative w-full max-w-md z-10"
      >
        {/* Back link */}
        <motion.div variants={itemVariants} className="absolute -top-16 left-0">
          <Link
            href="/"
            className="group flex items-center gap-2 text-gray-400 hover:text-white transition-colors"
          >
            <motion.div
              whileHover={{ x: -5 }}
              transition={{ type: "spring", stiffness: 400 }}
            >
              <ArrowLeft className="w-4 h-4" />
            </motion.div>
            <span>العودة للرئيسية</span>
          </Link>
        </motion.div>

        <motion.div
          variants={itemVariants}
          className="bg-white/10 backdrop-blur-2xl rounded-3xl shadow-2xl border border-white/10 overflow-hidden"
        >
          {/* Header */}
          <div className="bg-gradient-to-r from-amber-500 to-amber-600 p-8 text-center relative overflow-hidden">
            <motion.div
              initial={{ scale: 0 }}
              animate={{ scale: 1 }}
              transition={{ delay: 0.2, type: "spring" }}
              className="absolute -top-10 -right-10 w-40 h-40 bg-white/10 rounded-full"
            />
            <motion.div
              initial={{ scale: 0 }}
              animate={{ scale: 1 }}
              transition={{ delay: 0.3, type: "spring" }}
              className="absolute -bottom-10 -left-10 w-40 h-40 bg-white/10 rounded-full"
            />

            <motion.div
              initial={{ y: 20, opacity: 0 }}
              animate={{ y: 0, opacity: 1 }}
              transition={{ delay: 0.2 }}
              className="relative z-10"
            >
              <motion.div
                animate={{ rotate: [0, 10, -10, 0] }}
                transition={{ duration: 2, repeat: Infinity }}
                className="w-20 h-20 mx-auto mb-4 bg-white/20 rounded-2xl flex items-center justify-center backdrop-blur-sm"
              >
                {step === "otp" ? (
                  <KeyRound className="w-10 h-10 text-white" />
                ) : (
                  <Home className="w-10 h-10 text-white" />
                )}
              </motion.div>
              <h1 className="text-3xl font-bold text-white mb-2">SweetHome</h1>
              <p className="text-amber-100">
                {step === "otp" ? "أدخل رمز التحقق" : "مرحباً بعودتك!"}
              </p>
            </motion.div>
          </div>

          <div className="p-8">
            <AnimatePresence mode="wait">
              {step === "login" ? (
                <motion.form
                  key="login"
                  initial={{ opacity: 0, x: -20 }}
                  animate={{ opacity: 1, x: 0 }}
                  exit={{ opacity: 0, x: 20 }}
                  onSubmit={handleLogin}
                  className="space-y-6"
                >
                  {/* Login method tabs */}
                  <div className="flex gap-2 bg-white/5 p-1 rounded-xl">
                    <button
                      type="button"
                      onClick={() => {
                        setLoginMethod("email");
                        setFormData({ ...formData, credential: "" });
                      }}
                      className={`flex-1 py-2.5 rounded-lg text-sm font-medium transition-all flex items-center justify-center gap-2 ${
                        loginMethod === "email"
                          ? "bg-amber-500 text-white shadow-lg"
                          : "text-gray-400 hover:text-white"
                      }`}
                    >
                      <Mail className="w-4 h-4" />
                      بريد إلكتروني
                    </button>
                    <button
                      type="button"
                      onClick={() => {
                        setLoginMethod("phone");
                        setFormData({ ...formData, credential: "" });
                      }}
                      className={`flex-1 py-2.5 rounded-lg text-sm font-medium transition-all flex items-center justify-center gap-2 ${
                        loginMethod === "phone"
                          ? "bg-amber-500 text-white shadow-lg"
                          : "text-gray-400 hover:text-white"
                      }`}
                    >
                      <Phone className="w-4 h-4" />
                      رقم الهاتف
                    </button>
                  </div>

                  {/* Credential input */}
                  <div>
                    <label className="block text-sm font-medium text-gray-300 mb-2">
                      {loginMethod === "email"
                        ? "البريد الإلكتروني"
                        : "رقم الهاتف"}
                    </label>
                    <div className="relative group">
                      <div className="absolute inset-y-0 right-0 pr-3 flex items-center pointer-events-none">
                        {loginMethod === "email" ? (
                          <Mail
                            className={`w-5 h-5 transition-colors ${errors.credential ? "text-red-500" : "text-gray-400 group-focus-within:text-amber-500"}`}
                          />
                        ) : (
                          <Phone
                            className={`w-5 h-5 transition-colors ${errors.credential ? "text-red-500" : "text-gray-400 group-focus-within:text-amber-500"}`}
                          />
                        )}
                      </div>
                      <input
                        type="text"
                        // type={loginMethod === 'email' ? 'email' : 'tel'}
                        value={formData.credential}
                        onChange={(e) => handleCredentialChange(e.target.value)}
                        className={`w-full pr-12 pl-4 py-4 bg-white/5 border rounded-xl focus:outline-none focus:ring-2 focus:ring-amber-500 focus:border-transparent text-white placeholder-gray-500 transition-all ${
                          errors.credential
                            ? "border-red-500"
                            : "border-gray-700"
                        }`}
                        placeholder={
                          loginMethod === "email"
                            ? "example@email.com"
                            : "+963XXXXXXXXX"
                        }
                        dir="ltr"
                      />
                    </div>
                    {errors.credential && (
                      <motion.p
                        initial={{ opacity: 0, y: -10 }}
                        animate={{ opacity: 1, y: 0 }}
                        className="text-red-500 text-sm mt-1"
                      >
                        {errors.credential}
                      </motion.p>
                    )}
                  </div>

                  {/* Password */}
                  <div>
                    <label className="block text-sm font-medium text-gray-300 mb-2">
                      كلمة المرور
                    </label>
                    <div className="relative group">
                      <div className="absolute inset-y-0 right-0 pr-3 flex items-center pointer-events-none">
                        <Lock
                          className={`w-5 h-5 transition-colors ${errors.password ? "text-red-500" : "text-gray-400 group-focus-within:text-amber-500"}`}
                        />
                      </div>
                      <input
                        type={showPassword ? "text" : "password"}
                        value={formData.password}
                        onChange={(e) => {
                          setFormData({
                            ...formData,
                            password: e.target.value,
                          });
                          if (errors.password)
                            setErrors({ ...errors, password: null });
                        }}
                        className={`w-full pr-12 pl-12 py-4 bg-white/5 border rounded-xl focus:outline-none focus:ring-2 focus:ring-amber-500 focus:border-transparent text-white placeholder-gray-500 transition-all ${
                          errors.password ? "border-red-500" : "border-gray-700"
                        }`}
                        placeholder="أدخل كلمة المرور"
                      />
                      <button
                        type="button"
                        onClick={() => setShowPassword(!showPassword)}
                        className="absolute inset-y-0 left-0 pl-3 flex items-center"
                      >
                        {showPassword ? (
                          <EyeOff className="w-5 h-5 text-gray-400 hover:text-gray-300 transition-colors" />
                        ) : (
                          <Eye className="w-5 h-5 text-gray-400 hover:text-gray-300 transition-colors" />
                        )}
                      </button>
                    </div>
                    {errors.password && (
                      <motion.p
                        initial={{ opacity: 0, y: -10 }}
                        animate={{ opacity: 1, y: 0 }}
                        className="text-red-500 text-sm mt-1"
                      >
                        {errors.password}
                      </motion.p>
                    )}
                  </div>

                  {/* Remember + Forgot */}
                  <div className="flex items-center justify-between">
                    <label className="flex items-center gap-2 cursor-pointer group">
                      <input
                        type="checkbox"
                        checked={formData.rememberMe}
                        onChange={(e) =>
                          setFormData({
                            ...formData,
                            rememberMe: e.target.checked,
                          })
                        }
                        className="w-4 h-4 rounded border-gray-600 bg-white/5 text-amber-500 focus:ring-amber-500 focus:ring-offset-0"
                      />
                      <span className="text-sm text-gray-400 group-hover:text-white transition-colors">
                        تذكرني
                      </span>
                    </label>
                    <Link
                      href="/forgot-password"
                      className="text-sm text-amber-400 hover:text-amber-300 transition-colors"
                    >
                      نسيت كلمة المرور؟
                    </Link>
                  </div>

                  {/* Submit */}
                  <motion.button
                    type="submit"
                    disabled={isLoading || isSuccess}
                    className="relative w-full bg-gradient-to-r from-amber-500 to-amber-600 text-white py-4 rounded-xl font-bold text-lg overflow-hidden group disabled:opacity-50 disabled:cursor-not-allowed"
                    whileHover={{ scale: 1.02 }}
                    whileTap={{ scale: 0.98 }}
                  >
                    <span className="relative z-10 flex items-center justify-center gap-2">
                      {isLoading ? (
                        <>
                          <Loader2 className="w-5 h-5 animate-spin" />
                          جاري تسجيل الدخول...
                        </>
                      ) : isSuccess ? (
                        <>
                          <CheckCircle className="w-5 h-5" />
                          تم بنجاح!
                        </>
                      ) : (
                        <>
                          <LogIn className="w-5 h-5" />
                          تسجيل الدخول
                        </>
                      )}
                    </span>
                  </motion.button>
                </motion.form>
              ) : (
                /* OTP Verification Step */
                <motion.form
                  key="otp"
                  initial={{ opacity: 0, x: 20 }}
                  animate={{ opacity: 1, x: 0 }}
                  exit={{ opacity: 0, x: -20 }}
                  onSubmit={handleVerifyOTP}
                  className="space-y-6"
                >
                  <div className="text-center mb-4">
                    <Shield className="w-12 h-12 text-amber-500 mx-auto mb-3" />
                    <p className="text-gray-300 text-sm">
                      تم إرسال رمز التحقق إلى{" "}
                      <span className="text-white font-medium" dir="ltr">
                        {formData.credential}
                      </span>
                    </p>
                  </div>

                  <div>
                    <label className="block text-sm font-medium text-gray-300 mb-2">
                      رمز التحقق
                    </label>
                    <input
                      type="text"
                      value={otpCode}
                      onChange={(e) => {
                        setOtpCode(e.target.value);
                        if (otpError) setOtpError("");
                      }}
                      className={`w-full px-4 py-4 bg-white/5 border rounded-xl focus:outline-none focus:ring-2 focus:ring-amber-500 focus:border-transparent text-white text-center text-2xl tracking-[0.5em] placeholder-gray-500 transition-all ${
                        otpError ? "border-red-500" : "border-gray-700"
                      }`}
                      placeholder="______"
                      maxLength={6}
                      dir="ltr"
                    />
                    {otpError && (
                      <motion.p
                        initial={{ opacity: 0, y: -10 }}
                        animate={{ opacity: 1, y: 0 }}
                        className="text-red-500 text-sm mt-1 text-center"
                      >
                        {otpError}
                      </motion.p>
                    )}
                  </div>

                  <motion.button
                    type="submit"
                    disabled={isLoading || isSuccess}
                    className="relative w-full bg-gradient-to-r from-amber-500 to-amber-600 text-white py-4 rounded-xl font-bold text-lg disabled:opacity-50 disabled:cursor-not-allowed"
                    whileHover={{ scale: 1.02 }}
                    whileTap={{ scale: 0.98 }}
                  >
                    <span className="flex items-center justify-center gap-2">
                      {isLoading ? (
                        <>
                          <Loader2 className="w-5 h-5 animate-spin" />
                          جاري التحقق...
                        </>
                      ) : isSuccess ? (
                        <>
                          <CheckCircle className="w-5 h-5" />
                          تم بنجاح!
                        </>
                      ) : (
                        <>
                          <KeyRound className="w-5 h-5" />
                          تحقق
                        </>
                      )}
                    </span>
                  </motion.button>

                  <div className="flex items-center justify-between text-sm">
                    <button
                      type="button"
                      onClick={() => {
                        setStep("login");
                        setOtpCode("");
                        setOtpError("");
                        console.log("[OTP] Going back to login");
                      }}
                      className="text-gray-400 hover:text-white transition-colors"
                    >
                      ← العودة
                    </button>
                    <button
                      type="button"
                      onClick={resendOTP}
                      className="text-amber-400 hover:text-amber-300 transition-colors"
                    >
                      إعادة إرسال الرمز
                    </button>
                  </div>
                </motion.form>
              )}
            </AnimatePresence>

            <motion.p
              variants={itemVariants}
              className="text-center text-gray-400 mt-6"
            >
              ليس لديك حساب؟{" "}
              <Link
                href="/auth/choose-role"
                className="text-amber-400 hover:text-amber-300 font-medium transition-colors"
              >
                إنشاء حساب جديد
              </Link>
            </motion.p>
          </div>
        </motion.div>

        <motion.p
          variants={itemVariants}
          className="text-center text-gray-500 text-xs mt-4"
        >
          بتسجيل الدخول، أنت توافق على{" "}
          <Link
            href="/terms"
            className="text-amber-400 hover:text-amber-300 transition-colors"
          >
            شروط الاستخدام
          </Link>{" "}
          و{" "}
          <Link
            href="/privacy"
            className="text-amber-400 hover:text-amber-300 transition-colors"
          >
            سياسة الخصوصية
          </Link>
        </motion.p>
      </motion.div>
    </div>
  );
}
