"use client";

import { useCallback, useEffect, useRef } from "react";
import { useMeetingsStore } from "@/store";
import { listMeetings } from "@/lib/api";
import { normalizeMeetingStatus } from "@/lib/utils";
import type { ListMeetingsParams, ListMeetingItem } from "@/types/api";
import type { Meeting } from "@/types";

function getMeetingItems(res: Awaited<ReturnType<typeof listMeetings>>): ListMeetingItem[] {
  const items = Array.isArray(res) ? res : res.success && Array.isArray(res.data) ? res.data : [];
  return items.filter((item): item is ListMeetingItem => Boolean(item?.meeting_id || item?.recurring_candidate_id || item?.candidate_id));
}

function mapMeeting(item: ListMeetingItem): Meeting {
  const rd    = item.recording_details;
  // For scheduled meetings, use scheduled_at as the display date
  const date  = item.scheduled_at ?? rd?.started_at ?? item.recall_join_at ?? item.created_at;
  return {
    id:               String(item.meeting_id ?? item.recurring_candidate_id ?? item.candidate_id ?? ""),
    title:            typeof item.title === "string" && item.title.trim() ? item.title : "Untitled meeting",
    meetLink:         item.meet_link,
    status:           normalizeMeetingStatus(item.status),
    rawStatus:        item.status,
    platform:         item.platform,
    participantNames: item.participants_details?.names ?? [],
    date,
    duration:         rd?.duration_seconds ?? 0,
    participants:     [],
    transcript:       [],
    appToggleEnabled: item.app_toggle_enabled ?? undefined,
    recurringCandidateId: item.recurring_candidate_id ?? (item.candidate_id ?? undefined),
    statusSegment:    item.status_segment,
    isRecurring:      item.is_recurring,
  };
}

export function useMeetings(params: ListMeetingsParams & { skip?: boolean } = {}) {
  const { skip = false, ...restParams } = params;
  const { status, search, platform, type, time, sort_by } = restParams;

  const setMeetings        = useMeetingsStore((s) => s.setMeetings);
  const appendMeetings     = useMeetingsStore((s) => s.appendMeetings);
  const setListStatusFilter = useMeetingsStore((s) => s.setListStatusFilter);
  const setPagination      = useMeetingsStore((s) => s.setPagination);
  const setListSummary     = useMeetingsStore((s) => s.setListSummary);
  const setSegmentCounts   = useMeetingsStore((s) => s.setSegmentCounts);
  const setLoading         = useMeetingsStore((s) => s.setLoading);
  const setLoadingMore     = useMeetingsStore((s) => s.setLoadingMore);
  const setError           = useMeetingsStore((s) => s.setError);
  const pagination         = useMeetingsStore((s) => s.pagination);

  const pageRef = useRef(1);

  const fetch = useCallback(async (fetchParams: ListMeetingsParams = {}) => {
    const requestedStatus = fetchParams.status ?? status ?? "all";
    pageRef.current = 1;
    setLoading(true);
    setError(null);
    try {
      const res = await listMeetings({
        limit: 12,
        status,
        search,
        platform,
        type,
        time,
        sort_by,
        ...fetchParams,
        page: 1,
      });
      if (Array.isArray(res)) {
        setMeetings(getMeetingItems(res).map(mapMeeting));
        setListStatusFilter(requestedStatus);
      } else if (res.success) {
        setMeetings(getMeetingItems(res).map(mapMeeting));
        setListStatusFilter(requestedStatus);
        if (res.pagination)      setPagination(res.pagination);
        if (res.summary)         setListSummary(res.summary);
        // Save segment_counts for tab badge counts
        if (res.segment_counts)  setSegmentCounts(res.segment_counts);
      } else {
        setError("Failed to load meetings.");
      }
    } catch (err) {
      setError(err instanceof Error ? err.message : "Failed to load meetings.");
    } finally {
      setLoading(false);
    }
  }, [status, search, platform, type, time, sort_by, setMeetings, setListStatusFilter, setPagination, setListSummary, setSegmentCounts, setLoading, setError]);

  const fetchMore = useCallback(async () => {
    if (!pagination) return;
    if (useMeetingsStore.getState().loadingMore || useMeetingsStore.getState().loading) return;
    const nextPage = pageRef.current + 1;
    if (nextPage > pagination.total_pages) return;
    pageRef.current = nextPage;
    setLoadingMore(true);
    try {
      const res = await listMeetings({
        limit: 12,
        status,
        search,
        platform,
        type,
        time,
        sort_by,
        page: nextPage,
      });
      if (Array.isArray(res)) {
        appendMeetings(getMeetingItems(res).map(mapMeeting));
      } else if (res.success) {
        appendMeetings(getMeetingItems(res).map(mapMeeting));
        if (res.pagination) setPagination(res.pagination);
      }
    } catch {
      // silently fail — user can scroll again
    } finally {
      setLoadingMore(false);
    }
  }, [pagination, status, search, platform, type, time, sort_by, appendMeetings, setPagination, setLoadingMore]);

  useEffect(() => {
    if (!skip) fetch();
  }, [skip, fetch]);

  return { refetch: fetch, fetchMore };
}
