import { Input, Toast } from "@/components/common";
import { COLOR_SCALES } from "@/theme/colors";
import { FLEX } from "@/theme/mixins";
import { paragraph, title } from "@/theme/typography";
import { LinearGradient } from "expo-linear-gradient";
import { router } from "expo-router";
import * as SecureStore from "expo-secure-store";
import { StatusBar } from "expo-status-bar";
import React, { useState } from "react";
import {
  Image,
  KeyboardAvoidingView,
  SafeAreaView,
  ScrollView,
  StyleSheet,
  Text,
  TouchableOpacity,
  View,
} from "react-native";
import { loginUser, saveFcmToken } from "../../services/user";
import { surveys } from "../../services/survey";
import { initializeNotifications } from "../../services/notifications";
import useGuest from "@/hooks/useGuest";

export default function LoginScreen() {
  const { enableGuestMode } = useGuest();

  const [formData, setFormData] = useState({
    email: "",
    password: "",
  });
  const [showToast, setShowToast] = useState(false);
  const [toastMessage, setToastMessage] = useState("");
  const [toastType, setToastType] = useState("error");
  const [errors, setErrors] = useState({});
  const [isLoading, setIsLoading] = useState(false);

  const handleLogin = async () => {
    setIsLoading(true);

    try {
      const response = await loginUser({
        email: formData.email,
        password: formData.password,
      });

      if (response.success) {
        await SecureStore.setItemAsync(
          "accessToken",
          String(response?.data?.accessToken ?? "")
        );
        await SecureStore.setItemAsync(
          "refreshToken",
          String(response?.data?.refreshToken ?? "")
        );
        await SecureStore.setItemAsync(
          "userId",
          String(response?.data?.user?.id ?? "")
        );

        // RevenueCat webhook senkronu için kullanıcıyı bağla
        try {
          const userId = response?.data?.user?.id;
          if (userId) {
            const RevenueCatServiceModule = require("@/services/revenueCat");
            const RC =
              RevenueCatServiceModule?.identifyUser
                ? RevenueCatServiceModule
                : RevenueCatServiceModule?.default;
            await RC?.identifyUser?.(String(userId));
          }
        } catch (rcErr) {
          console.warn("RevenueCat identify:", rcErr?.message || rcErr);
        }
        
        // Misafir modunu kapat
        await SecureStore.deleteItemAsync('isGuest');
        
        // Bildirim izni al ve FCM/Expo push token'ı kaydet
        try {
          const { enabled } = await initializeNotifications();
          if (enabled) {
            const Notifications = await import('expo-notifications');
            const Constants = await import('expo-constants');
            const projectId = Constants.default?.expoConfig?.extra?.eas?.projectId 
              || Constants.default?.easConfig?.projectId;
            console.log('Project ID:', projectId);
            const tokenData = await Notifications.getExpoPushTokenAsync(
              projectId ? { projectId } : undefined
            );
            const expoPushToken = tokenData?.data;
            console.log('Expo Push Token:', expoPushToken);
            if (expoPushToken) {
              await saveFcmToken({ fcmToken: expoPushToken });
              console.log('FCM token kaydedildi:', expoPushToken);
            } else {
              console.log('Push token alınamadı');
            }
          }
        } catch (error) {
          console.error('Bildirim/FCM token hatası:', error?.message || error);
        }
        setToastMessage("Giriş başarılı");
        setToastType("success");
        setShowToast(true);

        setTimeout(async () => {
          try {
            const surveyRes = await surveys();
            const hasSurveys = Array.isArray(surveyRes?.data?.surveys) && surveyRes.data.surveys.length > 0;
            await router.replace(hasSurveys ? "/(survey)" : "/(tabs)/home");
          } catch (routerError) {
            console.error("Router hatası:", routerError);
          }
        }, 1500);
      } else {
        // Doğrulanmamış hesap kontrolü
        const msg = response?.message || "Giriş yapılırken bir hata oluştu";
        const isUnverified = msg.toLowerCase().includes("doğrulanmamış") || msg.toLowerCase().includes("doğrulama");
        
        setToastMessage(msg);
        setToastType("error");
        setShowToast(true);

        if (isUnverified) {
          await SecureStore.setItemAsync("email", String(formData?.email ?? ""));
          setTimeout(() => router.push("/verify-account"), 1500);
        }
      }
    } catch (error) {
      const msg = error?.message || "Giriş yapılırken bir hata oluştu";
      const isUnverified = msg.toLowerCase().includes("doğrulanmamış") || msg.toLowerCase().includes("doğrulama");
      const isInactive = msg === "Hesabınız aktif değil";

      setToastMessage(msg);
      setToastType("error");
      setShowToast(true);

      if (isUnverified) {
        // Doğrulanmamış hesap → verify-account sayfasına yönlendir
        await SecureStore.setItemAsync("email", String(formData?.email ?? ""));
        setTimeout(() => router.push("/verify-account"), 1500);
        return;
      }

      if (isInactive) {
        await SecureStore.setItemAsync("email", String(formData?.email ?? ""));
        setTimeout(() => router.push("/verify-phone"), 1500);
        return;
      }

      console.error("Login error:", error);
    } finally {
      setIsLoading(false);
    }
  };

  const handleGuestLogin = async () => {
    try {
      await enableGuestMode();
      setToastMessage("Misafir olarak giriş yapıldı");
      setToastType("success");
      setShowToast(true);
      
      setTimeout(() => {
        router.replace("/(tabs)/home");
      }, 1000);
    } catch (error) {
      console.error("Guest login error:", error);
      setToastMessage("Misafir girişi başarısız");
      setToastType("error");
      setShowToast(true);
    }
  };

  return (
    <LinearGradient
      colors={["#E35367", "#B4001A", "#bd4050"]}
      style={styles.container}
    >
      <StatusBar style="light" />
      <ScrollView 
        style={styles.mainScrollView}
        contentContainerStyle={styles.mainScrollContent}
        showsVerticalScrollIndicator={false}
        bounces={false}
      >
        <View style={styles.topSection}>
          <SafeAreaView style={styles.topContent}>
            <View style={styles.imageContainer}>
              <Image
                source={require("@/assets/images/oturan-lokma.png")}
                style={styles.loginImage}
                resizeMode="contain"
              />
            </View>
            <View style={styles.backgroundImageContainer}>
              <Image
                source={require("@/assets/images/authentication/food-waste.png")}
                style={styles.backgroundImage}
                resizeMode="contain"
              />
            </View>
            <Text style={styles.headerText}>
              Hadi giriş{"\n"}yapmanızı sağlayalım!
            </Text>
          </SafeAreaView>
        </View>
        
        <View style={styles.formSection}>
          <View style={styles.formContainer}>
            <View style={styles.accountHelperContainer}>
              <Text style={styles.accountHelperText}>
                Henüz bir hesabınız yok mu?
              </Text>
              <TouchableOpacity onPress={() => router.push("/register")}>
                <Text style={styles.registerLink}>Kayıt Ol</Text>
              </TouchableOpacity>
            </View>

            <Input
              label="E-mail Adresiniz"
              placeholder="info@example.com"
              value={formData.email}
              onChangeText={(text) => {
                setFormData({ ...formData, email: text });
                if (errors.email) setErrors({ ...errors, email: "" });
              }}
              error={errors.email}
              keyboardType="email-address"
              autoCapitalize="none"
              leftIcon={
                <Image
                  source={require("@/assets/images/icons/email.png")}
                  style={styles.inputIcon}
                />
              }
              style={styles.inputStyle}
            />

            <Input
              label="Şifreniz"
              placeholder="info: XaZka2sa3"
              value={formData.password}
              onChangeText={(text) => {
                setFormData({ ...formData, password: text });
                if (errors.password) setErrors({ ...errors, password: "" });
              }}
              error={errors.password}
              isPassword={true}
              leftIcon={
                <Image
                  source={require("@/assets/images/icons/password.png")}
                  style={styles.inputIcon}
                />
              }
              style={styles.inputStyle}
            />

            <View style={styles.forgotPasswordContainer}>
              <TouchableOpacity onPress={() => router.push("/forgot-password")}>
                <Text style={styles.forgotPasswordText}>
                  Şifrenizi mi unuttunuz?
                </Text>
              </TouchableOpacity>
            </View>

            <TouchableOpacity
              style={styles.loginButton}
              onPress={handleLogin}
              disabled={isLoading}
              activeOpacity={0.8}
            >
              <LinearGradient
                colors={["#FF0025", "#FF0025", "#FF0025"]}
                style={styles.loginButtonGradient}
              >
                <Text style={styles.loginButtonText}>
                  {isLoading ? "Giriş yapılıyor..." : "Giriş Yap"}
                </Text>
              </LinearGradient>
            </TouchableOpacity>

            <TouchableOpacity
              style={styles.guestButton}
              onPress={handleGuestLogin}
              activeOpacity={0.8}
            >
              <Text style={styles.guestButtonText}>Misafir Olarak Devam Et</Text>
            </TouchableOpacity>
          </View>

          <View style={styles.formBackground}>
            <Image
              source={require("@/assets/images/icons/small-logo.png")}
              style={styles.formBackgroundImage}
            />
          </View>
        </View>
      </ScrollView>
      
      <Toast
        visible={showToast}
        message={toastMessage}
        type={toastType}
        onHide={() => setShowToast(false)}
      />
    </LinearGradient>
  );
}

const styles = StyleSheet.create({
  container: {
    ...FLEX.fill,
  },
  mainScrollView: {
    flex: 1,
  },
  mainScrollContent: {
    flexGrow: 1,
  },
  topSection: {
    minHeight: 280,
    width: "100%",
  },
  topContent: {
    flex: 1,
    alignItems: "center",
    justifyContent: "space-between",
    paddingTop: 40,
    paddingBottom: 20,
  },
  imageContainer: {
    alignItems: "center",
    justifyContent: "center",
    marginTop: 20,
  },
  loginImage: {
    width: 153,
    height: 176,
    resizeMode: "contain",
  },
  backgroundImageContainer: {
    position: "absolute",
    width: "100%",
    height: "100%",
    opacity: 0.2,
    zIndex: -1,
  },
  backgroundImage: {
    width: "100%",
    height: "100%",
  },
  headerText: {
    ...title["L/Bold"],
    color: "white",
    textAlign: "center",
    marginBottom: 10,
  },
  formSection: {
    width: "100%",
    paddingHorizontal: 20,
    paddingTop: 24,
    paddingBottom: 100,
    backgroundColor: "#fff",
    borderTopLeftRadius: 30,
    borderTopRightRadius: 30,
    minHeight: 500,
  },
  formContainer: {
    paddingHorizontal: 24,
    paddingTop: 10,
  },
  accountHelperContainer: {
    flexDirection: "column",
    alignItems: "center",
    marginBottom: 20,
  },
  accountHelperText: {
    ...paragraph["S/Regular"],
    color: COLOR_SCALES.gray[50],
  },
  registerLink: {
    ...paragraph["S/Bold"],
    color: "#FF0025",
    marginTop: 4,
    textDecorationLine: "underline",
  },
  inputIcon: {
    width: 20,
    height: 20,
    opacity: 0.5,
  },
  inputStyle: {
    marginBottom: 16,
  },
  forgotPasswordContainer: {
    alignItems: "flex-end",
    marginTop: 8,
    marginBottom: 20,
  },
  forgotPasswordText: {
    ...paragraph["S/Bold"],
    color: "#FF0025",
    textDecorationLine: "underline",
  },
  loginButton: {
    alignSelf: "center",
    marginTop: 30,
    marginBottom: 16,
    borderRadius: 32,
    overflow: "hidden",
    width: "100%",
    borderBottomWidth: 3,
    borderTopWidth: 1,
    borderLeftWidth: 3,
    borderRightWidth: 3,
    borderColor: "#52000C",
  },
  loginButtonGradient: {
    paddingVertical: 15,
    paddingHorizontal: 40,
    alignItems: "center",
    justifyContent: "center",
  },
  loginButtonText: {
    ...paragraph["M/Bold"],
    color: "#fff",
    textAlign: "center",
  },
  guestButton: {
    alignSelf: "center",
    marginTop: 12,
    marginBottom: 20,
    paddingVertical: 15,
    paddingHorizontal: 40,
    borderRadius: 32,
    borderWidth: 2,
    borderColor: "#FF0025",
    backgroundColor: "transparent",
    width: "100%",
  },
  guestButtonText: {
    ...paragraph["M/Bold"],
    color: "#FF0025",
    textAlign: "center",
  },
  formBackground: {
    alignItems: "center",
    marginTop: 20,
  },
  formBackgroundImage: {
    width: 100,
    height: 100,
  },
});
