"use client";

import { useCallback, useMemo, useState } from "react";

import { useQuery } from "@tanstack/react-query";

import type { MeetingRequest } from "../meeting-request-data";
import { getMeetingRequests } from "../service/meeting-requests-service";

export type MeetingRequestsViewMode = "table" | "calendar";

export type MeetingRequestsFiltersState = {
    status: string[];
    year: string;
    issues: string;
};

const defaultFilters: MeetingRequestsFiltersState = {
    status: [],
    year: "",
    issues: "",
};

const meetingRequestQueryKeys = {
    list: ["meeting-requests"] as const,
};

const EMPTY_ROWS: MeetingRequest[] = [];

function getErrorMessage(error: unknown) {
    return error instanceof Error ? error.message : "Failed to fetch data";
}

export function useMeetingRequests() {
    const [viewMode, setViewMode] = useState<MeetingRequestsViewMode>("table");
    const [filters, setFilters] =
        useState<MeetingRequestsFiltersState>(defaultFilters);

    const query = useQuery({
        queryKey: meetingRequestQueryKeys.list,
        queryFn: getMeetingRequests,
    });

    const rows = query.data ?? EMPTY_ROWS;
    const loading = query.isLoading || query.isFetching;
    const error = query.error ? getErrorMessage(query.error) : "";

    const filteredRows = useMemo(() => {
        return rows.filter((row) => {
            const matchStatus =
                filters.status.length > 0 ? filters.status.includes(row.status) : true;

            const matchYear = filters.year ? String(row.year) === filters.year : true;

            const matchIssues = filters.issues
                ? String(row.issueCount) === filters.issues
                : true;

            return matchStatus && matchYear && matchIssues;
        });
    }, [rows, filters]);

    const updateFilter = useCallback(
        <K extends keyof MeetingRequestsFiltersState>(
            name: K,
            value: MeetingRequestsFiltersState[K]
        ) => {
            setFilters((prev) => ({
                ...prev,
                [name]: value,
            }));
        },
        []
    );

    const clearFilters = useCallback(() => {
        setFilters(defaultFilters);
    }, []);

    return {
        rows,
        filteredRows,
        filters,
        updateFilter,
        clearFilters,
        viewMode,
        setViewMode,
        loading,
        error,
        refetch: query.refetch,
    };
}
