import { getShowById, Show } from "@/apis/showApi";

import ParticipantDetails from "@/components/ui/ParticipantDeatails";

import ShowInfo from "@/components/ui/ShowInfo";
import StackHeader from "@/components/ui/StackHeader";
import { useSeasonContext } from "@/contexts/SeasonContext";
import * as Haptics from "expo-haptics";
import { router, useLocalSearchParams } from "expo-router";
import React, { useState } from "react";
import {
  Dimensions,
  Image,
  ScrollView,
  Text,
  TouchableOpacity,
  View,
} from "react-native";
import styles from "./stackStyles/showDetailStyles";

export default function ShowDetails() {
  const {
    // bannerUri,
    // description,
    // concept,
    // genres,
    // streamingService,
    id,
    // endDate,
  } = useLocalSearchParams();

  const [show, setShow] = useState<Show | null>(null);
  const [, setLoading] = useState(true);

  const [selectedParticipants, setSelectedParticipants] =
    React.useState<boolean>(true);
  const [selectedSeason, setSelectedSeason] = React.useState<number>(1);
  const showId = Number(id);
  const { fetchSeasonParticipants, fetchSeasonCount, fetchSeasonDates } =
    useSeasonContext();
  const [seasonCount, setSeasonCount] = React.useState<number>(0);
  const [participants, setParticipants] = React.useState<
    { id: number; name: string; imageUri: string }[]
  >([]);
  const [startDate, setStartDate] = React.useState<string | undefined>(
    undefined
  );
  const [pLoading, setPLoading] = React.useState(false);
  const [pError, setPError] = React.useState<string | null>(null);

  const sortedParticipants = React.useMemo(() => {
    return participants.sort((a, b) =>
      a.name.localeCompare(b.name, "de", { sensitivity: "base" })
    );
  }, [participants]);

  React.useEffect(() => {
    if (!showId) return;

    const fetchShow = async () => {
      try {
        const data = await getShowById(showId);
        setShow(data);
      } finally {
        setLoading(false);
      }
    };

    fetchShow();

    let active = true;
    (async () => {
      const count = await fetchSeasonCount(showId);
      if (active) {
        setSeasonCount(count);
        if (count > 0 && selectedSeason > count) setSelectedSeason(1);
      }
    })();
    return () => {
      active = false;
    };
  }, [showId, fetchSeasonCount, selectedSeason]);

  React.useEffect(() => {
    if (!showId || !selectedSeason) return;
    let active = true;
    (async () => {
      setPError(null);
      setPLoading(true);
      try {
        const [data, dates] = await Promise.all([
          fetchSeasonParticipants(showId, selectedSeason),
          fetchSeasonDates(showId, selectedSeason),
        ]);
        if (active) {
          setParticipants(data);
          setStartDate(dates?.startDate);
        }
      } catch {
        if (active) setPError("Fehler beim Laden");
      } finally {
        if (active) setPLoading(false);
      }
    })();
    return () => {
      active = false;
    };
  }, [showId, selectedSeason, fetchSeasonParticipants, fetchSeasonDates]);

  const formattedStartDate = React.useMemo(() => {
    if (!startDate) return "";
    const d = new Date(startDate);
    if (isNaN(d.getTime())) return "";
    return d.toLocaleDateString("de-DE", {
      day: "2-digit",
      month: "long",
      year: "numeric",
    });
  }, [startDate]);

  const handleOpenParticipant = React.useCallback(
    (p: { id: number; name: string }) => {
      router.push({
        pathname: "/participant",
        params: {
          participantId: p.id,
          name: p.name,
          originShowId: String(showId),
          originSeason: String(selectedSeason),
        },
      });
    },
    [showId, selectedSeason]
  );

  return (
    <View style={styles.mainContainer}>
      <StackHeader />
      <ScrollView
        showsVerticalScrollIndicator={false}
        contentContainerStyle={{
          paddingBottom: Dimensions.get("window").height * 0.1,
        }}
      >
        {formattedStartDate ? (
          <Text style={styles.startDate}>{formattedStartDate}</Text>
        ) : null}
        <ShowInfo
          seasons={seasonCount}
          participants={participants.length}
          streamingService={show?.streamingService as string}
          startDate={startDate as string}
          endDate={show?.endDate as string | null}
        />

        <View style={styles.showBannerLogoContainer}>
          <Image
            source={{
              uri: show?.bannerUri as string,
            }}
            style={styles.showBannerLogo}
            resizeMode="cover"
          />
        </View>
        <View style={styles.infoContainner}>
          <TouchableOpacity onPress={() => setSelectedParticipants(true)}>
            <Text
              style={[
                styles.infoLabel,
                {
                  fontWeight: selectedParticipants ? "bold" : "normal",
                  color: selectedParticipants ? "#199edb" : "hsl(0, 0%, 65%)",
                },
              ]}
            >
              Teilnehmer
            </Text>
          </TouchableOpacity>
          <TouchableOpacity onPress={() => setSelectedParticipants(false)}>
            <Text
              style={[
                styles.infoLabel,
                {
                  fontWeight: !selectedParticipants ? "bold" : "normal",
                  color: !selectedParticipants ? "#199edb" : "hsl(0, 0%, 65%)",
                },
              ]}
            >
              Details
            </Text>
          </TouchableOpacity>
        </View>
        {selectedParticipants ? (
          <>
            <View style={styles.seasonsSection}>
              <Text style={styles.seasonsLabel}>Staffeln</Text>
              <ScrollView
                horizontal
                showsHorizontalScrollIndicator={false}
                contentContainerStyle={styles.seasonList}
              >
                {Array.from({ length: seasonCount }, (_, idx) => idx + 1).map(
                  (season) => (
                    <TouchableOpacity
                      key={season}
                      style={[
                        styles.seasonContainer,
                        {
                          backgroundColor:
                            selectedSeason === season
                              ? "#199edb"
                              : "hsl(0, 0%, 20%)",
                        },
                      ]}
                      onPress={() => {
                        setSelectedSeason(season);
                        Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light);
                      }}
                    >
                      <Text style={styles.seasonLabel}>{season}</Text>
                    </TouchableOpacity>
                  )
                )}
              </ScrollView>
            </View>

            <View
              style={[
                styles.participantsDetailsContainer,
                styles.participantSection,
              ]}
            >
              {pError && (
                <Text style={{ color: "tomato", marginBottom: 8 }}>
                  {pError}
                </Text>
              )}
              {!pLoading && !pError && participants.length === 0 && (
                <Text style={{ color: "gray" }}>Keine Teilnehmer.</Text>
              )}
              {sortedParticipants.map((p) => (
                <TouchableOpacity
                  key={p.id}
                  style={[
                    styles.participantContainer,
                    { backgroundColor: "hsl(336, 79%, 63%)" },
                  ]}
                  onPress={() => handleOpenParticipant(p)}
                >
                  <Image
                    source={{ uri: p.imageUri }}
                    style={{ width: "100%", height: "100%", borderRadius: 10 }}
                    resizeMode="cover"
                    blurRadius={p.imageUri.includes("pravatar") ? 16 : 0}
                  />
                  <Text style={styles.participantLabel} numberOfLines={2}>
                    {p.name}
                  </Text>
                </TouchableOpacity>
              ))}
            </View>
          </>
        ) : (
          <ParticipantDetails
            description={show?.description as string}
            concept={show?.concept as string}
            genres={show?.genres as string[]}
            streamingService={show?.streamingService as string}
          />
        )}
      </ScrollView>
    </View>
  );
}
