import { useRef, useEffect, useState, useMemo } from 'react';
import { View, Text, TouchableOpacity, Animated, ActivityIndicator } from 'react-native';
import { Image } from 'expo-image';
import { Ionicons } from '@expo/vector-icons';
import { useTranslation } from 'react-i18next';
import { useColors, type ColorScheme } from '../../lib/theme';
import { RemoveDomainSheet } from './RemoveDomainSheet';
import type { CustomDomain } from '../../hooks/useCustomDomains';

// ─── Meine Filter (unified web + mail_domain) ─────────────────────────────────

type MyFiltersProps = {
  domains: CustomDomain[];
  totalCount: number;
  totalLimit: number;
  globalBlocklistCount: number;
  onAddPress: () => void;
  onRemoveDomain: (id: string) => Promise<void>;
  colors: ColorScheme;
};

/**
 * "Meine Filter" — unified Sektion für web + mail_domain Einträge.
 *
 * Ein Slot-Pool: totalLimit = Legend 20 / Pro 10 (web+mail zusammen).
 * Kacheln zeigen Typ-Badge (Web / Mail). Entfernen via RemoveDomainSheet.
 */
export function MyFiltersList({
  domains,
  totalCount,
  totalLimit,
  globalBlocklistCount,
  onAddPress,
  onRemoveDomain,
  colors,
}: MyFiltersProps) {
  const { t } = useTranslation();

  const visibleDomains = useMemo(
    () => domains.filter((d) => d.status !== 'approved'),
    [domains],
  );

  const atLimit = totalCount >= totalLimit;
  const fillAnim = useRef(new Animated.Value(0)).current;
  const ratio = totalLimit > 0 ? Math.min(totalCount / totalLimit, 1) : 0;

  useEffect(() => {
    Animated.timing(fillAnim, { toValue: ratio, duration: 380, useNativeDriver: false }).start();
  }, [ratio]);

  const pct = ratio * 100;
  const barColor = pct >= 90 ? colors.error : pct >= 60 ? colors.warning : colors.brandOrange;
  const badgeBg = atLimit ? '#fee2e2' : colors.surfaceElevated;
  const badgeFg = atLimit ? colors.error : colors.textMuted;

  return (
    <View
      style={{
        backgroundColor: colors.surface,
        borderRadius: 16,
        borderWidth: 1,
        borderColor: colors.border,
        overflow: 'hidden',
      }}
    >
      <View
        style={{
          flexDirection: 'row',
          alignItems: 'center',
          paddingHorizontal: 14,
          paddingTop: 12,
          paddingBottom: 10,
          gap: 8,
        }}
      >
        <Text style={{ flex: 1, fontSize: 14, fontFamily: 'Nunito_700Bold', color: colors.text }}>
          {t('blocker.my_filters_title')}
        </Text>
        <View
          style={{
            paddingHorizontal: 8,
            paddingVertical: 3,
            borderRadius: 999,
            backgroundColor: badgeBg,
          }}
        >
          <Text style={{ fontSize: 11, fontFamily: 'Nunito_600SemiBold', color: badgeFg }}>
            {t('blocker.count_label', { count: totalCount, max: totalLimit })}
          </Text>
        </View>
        <TouchableOpacity
          onPress={atLimit ? undefined : onAddPress}
          activeOpacity={atLimit ? 1 : 0.75}
          style={{
            width: 28,
            height: 28,
            borderRadius: 14,
            backgroundColor: atLimit ? colors.surfaceElevated : colors.brandOrange,
            alignItems: 'center',
            justifyContent: 'center',
          }}
        >
          <Ionicons name="add" size={18} color={atLimit ? colors.textMuted : '#fff'} />
        </TouchableOpacity>
      </View>

      <View style={{ paddingHorizontal: 14, paddingBottom: 14, gap: 12 }}>
        <View
          style={{
            height: 5,
            borderRadius: 3,
            backgroundColor: colors.surfaceElevated,
            overflow: 'hidden',
          }}
        >
          <Animated.View
            style={{
              height: '100%',
              borderRadius: 3,
              backgroundColor: barColor,
              width: fillAnim.interpolate({ inputRange: [0, 1], outputRange: ['0%', '100%'] }),
            }}
          />
        </View>

        {visibleDomains.length === 0 ? (
          <MyFiltersEmptyState onAddPress={onAddPress} colors={colors} />
        ) : (
          <FilterTilesGrid domains={visibleDomains} onRemoveDomain={onRemoveDomain} />
        )}

        <View style={{ flexDirection: 'row', alignItems: 'flex-start', gap: 6, paddingTop: 2 }}>
          <Ionicons name="shield-checkmark-outline" size={13} color={colors.textMuted} style={{ marginTop: 1 }} />
          <Text
            style={{
              flex: 1,
              fontSize: 11,
              fontFamily: 'Nunito_400Regular',
              color: colors.textMuted,
              lineHeight: 16,
            }}
          >
            {t('blocker.vip_global_hint', { count: globalBlocklistCount })}
          </Text>
        </View>
      </View>
    </View>
  );
}

function MyFiltersEmptyState({ onAddPress, colors }: { onAddPress: () => void; colors: ColorScheme }) {
  const { t } = useTranslation();
  return (
    <TouchableOpacity onPress={onAddPress} activeOpacity={0.7}>
      <View
        style={{
          paddingVertical: 28,
          paddingHorizontal: 16,
          borderRadius: 14,
          borderWidth: 1,
          borderStyle: 'dashed',
          borderColor: colors.border,
          alignItems: 'center',
          gap: 6,
        }}
      >
        <Ionicons name="add-circle-outline" size={26} color={colors.textMuted} />
        <Text
          style={{
            fontSize: 13,
            fontFamily: 'Nunito_400Regular',
            color: colors.textMuted,
            textAlign: 'center',
            lineHeight: 18,
          }}
        >
          {t('blocker.my_filters_empty')}
        </Text>
      </View>
    </TouchableOpacity>
  );
}

function FilterTilesGrid({
  domains,
  onRemoveDomain,
}: {
  domains: CustomDomain[];
  onRemoveDomain: (id: string) => Promise<void>;
}) {
  return (
    <View style={{ flexDirection: 'row', flexWrap: 'wrap', rowGap: 10, columnGap: 8 }}>
      {domains.map((d) => (
        <FilterTile key={d.id} domain={d} onRemove={onRemoveDomain} />
      ))}
    </View>
  );
}

function FilterTile({
  domain,
  onRemove,
}: {
  domain: CustomDomain;
  onRemove: (id: string) => Promise<void>;
}) {
  const { t } = useTranslation();
  const colors = useColors();
  const [imgError, setImgError] = useState(false);
  const [removeSheetOpen, setRemoveSheetOpen] = useState(false);
  const [removing, setRemoving] = useState(false);

  const isMail = domain.type === 'mail_domain';
  const stripped = domain.domain.replace(/^www\./, '');

  const statusColor: string = (() => {
    switch (domain.status) {
      case 'submitted': return colors.warning;
      case 'rejected': return colors.error;
      default: return colors.brandOrange;
    }
  })();

  const badgeLabel: string = (() => {
    switch (domain.status) {
      case 'submitted': return t('blocker.domain_badge_pruefung');
      case 'rejected': return t('blocker.domain_badge_rejected');
      default: return t('blocker.domain_badge_active');
    }
  })();

  async function handleConfirmRemove() {
    setRemoving(true);
    try {
      await onRemove(domain.id);
    } finally {
      setRemoving(false);
    }
  }

  return (
    <>
      <View
        style={{
          backgroundColor: colors.bg,
          borderWidth: 1,
          borderColor: colors.border,
          borderRadius: 14,
          padding: 8,
          width: '31%',
          minHeight: 118,
          gap: 4,
          opacity: removing ? 0.4 : 1,
        }}
      >
        {/* Type + Status badge row */}
        <View style={{ flexDirection: 'row', alignItems: 'center', justifyContent: 'space-between' }}>
          <View
            style={{
              paddingHorizontal: 4,
              paddingVertical: 1,
              borderRadius: 999,
              backgroundColor: isMail ? '#dbeafe' : colors.surfaceElevated,
            }}
          >
            <Text style={{ fontSize: 7, fontFamily: 'Nunito_600SemiBold', color: isMail ? '#2563eb' : colors.textMuted }}>
              {isMail ? t('blocker.type_mail') : t('blocker.type_web')}
            </Text>
          </View>
          <View
            style={{
              paddingHorizontal: 4,
              paddingVertical: 1,
              borderRadius: 999,
              backgroundColor: statusColor,
            }}
          >
            <Text style={{ fontSize: 7, fontFamily: 'Nunito_700Bold', color: '#fff' }}>
              {badgeLabel}
            </Text>
          </View>
        </View>

        {/* Icon + label */}
        <View style={{ flex: 1, alignItems: 'center', justifyContent: 'center', gap: 4, paddingVertical: 6 }}>
          {isMail ? (
            <View
              style={{
                width: 24,
                height: 24,
                borderRadius: 5,
                backgroundColor: '#dbeafe',
                alignItems: 'center',
                justifyContent: 'center',
              }}
            >
              <Ionicons name="mail-outline" size={13} color="#2563eb" />
            </View>
          ) : !imgError ? (
            <Image
              source={{ uri: `https://www.google.com/s2/favicons?domain=${stripped}&sz=128` }}
              style={{ width: 24, height: 24, borderRadius: 5 }}
              onError={() => setImgError(true)}
            />
          ) : (
            <View
              style={{
                width: 24,
                height: 24,
                borderRadius: 5,
                backgroundColor: '#525252',
                alignItems: 'center',
                justifyContent: 'center',
              }}
            >
              <Text style={{ fontSize: 8, fontFamily: 'Nunito_700Bold', color: '#fff' }}>
                {stripped.slice(0, 2).toUpperCase()}
              </Text>
            </View>
          )}
          <Text
            numberOfLines={1}
            style={{
              fontSize: 10,
              fontFamily: 'Nunito_600SemiBold',
              color: colors.text,
              textAlign: 'center',
              width: '100%',
            }}
          >
            {stripped}
          </Text>
        </View>

        {/* Remove button */}
        <TouchableOpacity
          onPress={() => setRemoveSheetOpen(true)}
          disabled={removing}
          activeOpacity={0.65}
          style={{
            height: 26,
            borderRadius: 6,
            borderWidth: 1,
            borderColor: colors.border,
            alignItems: 'center',
            justifyContent: 'center',
          }}
        >
          {removing ? (
            <ActivityIndicator size="small" color={colors.textMuted} />
          ) : (
            <Ionicons name="trash-outline" size={13} color={colors.textMuted} />
          )}
        </TouchableOpacity>
      </View>

      <RemoveDomainSheet
        visible={removeSheetOpen}
        domain={stripped}
        onClose={() => setRemoveSheetOpen(false)}
        onConfirmRemove={handleConfirmRemove}
      />
    </>
  );
}

// ─── VIP-Liste (collapsible, Zweitschutz) ────────────────────────────────────

type VipListProps = {
  domains: CustomDomain[];
  globalBlocklistCount: number;
  open: boolean;
  onToggle: () => void;
  colors: ColorScheme;
};

/**
 * "VIP-Liste" — Zweitschutz-Sektion. Collapsible.
 *
 * Zeigt die zusammengesetzte VIP-Layer-2-Liste:
 *   - Eigene Web-Domains des Users (für Family-Controls / webContent-Sync)
 *   - Hinweis auf den globalen kuratierten Teil (nicht editierbar)
 *
 * Diese Liste greift als Zweitschutz, falls Layer 1 (VPN/URL-Filter)
 * ein technisches Problem hat.
 */
export function VipDomainList({ domains, globalBlocklistCount, open, onToggle, colors }: VipListProps) {
  const { t } = useTranslation();

  const webDomains = useMemo(
    () => domains.filter((d) => (d.type === 'web' || !d.type) && d.status !== 'approved'),
    [domains],
  );

  return (
    <View
      style={{
        backgroundColor: colors.surface,
        borderRadius: 16,
        borderWidth: 1,
        borderColor: colors.border,
        overflow: 'hidden',
      }}
    >
      <TouchableOpacity
        onPress={onToggle}
        activeOpacity={0.7}
        style={{
          flexDirection: 'row',
          alignItems: 'center',
          paddingHorizontal: 14,
          paddingVertical: 12,
          gap: 8,
        }}
      >
        <Ionicons name="shield-half-outline" size={16} color={colors.textMuted} />
        <Text style={{ flex: 1, fontSize: 14, fontFamily: 'Nunito_700Bold', color: colors.text }}>
          {t('blocker.vip_layer2_title')}
        </Text>
        <Ionicons
          name={open ? 'chevron-up' : 'chevron-down'}
          size={16}
          color={colors.textMuted}
        />
      </TouchableOpacity>

      {open && (
        <View style={{ paddingHorizontal: 14, paddingBottom: 14, gap: 10 }}>
          <Text
            style={{
              fontSize: 12,
              fontFamily: 'Nunito_400Regular',
              color: colors.textMuted,
              lineHeight: 17,
            }}
          >
            {t('blocker.vip_layer2_desc')}
          </Text>

          {webDomains.length > 0 && (
            <View style={{ flexDirection: 'row', flexWrap: 'wrap', rowGap: 8, columnGap: 6 }}>
              {webDomains.map((d) => (
                <VipReadonlyChip key={d.id} domain={d} colors={colors} />
              ))}
            </View>
          )}

          <View style={{ flexDirection: 'row', alignItems: 'flex-start', gap: 6, paddingTop: 2 }}>
            <Ionicons name="shield-checkmark-outline" size={13} color={colors.textMuted} style={{ marginTop: 1 }} />
            <Text
              style={{
                flex: 1,
                fontSize: 11,
                fontFamily: 'Nunito_400Regular',
                color: colors.textMuted,
                lineHeight: 16,
              }}
            >
              {t('blocker.vip_layer2_global_hint', { count: globalBlocklistCount })}
            </Text>
          </View>
        </View>
      )}
    </View>
  );
}

function VipReadonlyChip({ domain, colors }: { domain: CustomDomain; colors: ColorScheme }) {
  const stripped = domain.domain.replace(/^www\./, '');
  return (
    <View
      style={{
        flexDirection: 'row',
        alignItems: 'center',
        gap: 5,
        paddingHorizontal: 8,
        paddingVertical: 4,
        borderRadius: 999,
        backgroundColor: colors.surfaceElevated,
        borderWidth: 1,
        borderColor: colors.border,
      }}
    >
      <Ionicons name="globe-outline" size={11} color={colors.textMuted} />
      <Text
        numberOfLines={1}
        style={{ fontSize: 11, fontFamily: 'Nunito_600SemiBold', color: colors.text, maxWidth: 120 }}
      >
        {stripped}
      </Text>
    </View>
  );
}
