import React, {useContext, useEffect, useState} from 'react';
import { HrRequest, HrRequestParams, HrRequestType } from "../../../../models/HrSupport/HrRequest";
import HrRequestsFilters from './HrRequestsFilters';
import useListControl from "../../../../hooks/useListControl";
import {getMyEmployeeOverview, getRequests, getRequestTypes} from '../../../../API/hr_support';
import { Order } from '../../../UI/DuaList/ListHeader/ListHead';
import SearchBar from "../../../UI/SearchBar/SearchBar";
import CustomRadioSelect from "../../../UI/Forms/CustomSelect/CustomRadioSelect";
import SelectItem from "../../../UI/Forms/CustomSelect/SelectItem";
import RequestsList from "./RequestsList";
import './HrRequestsList.scss';
import {useParams, useSearchParams} from "react-router-dom";
import useRole from "../../../../hooks/useRole";
import {RecordsResponse} from "../../../../models/Axios";
import axios, {AxiosResponse, InternalAxiosRequestConfig} from "axios";
import {getCollaborator} from "../../../../API/rescom";
import EmptyList from "../../../UI/DuaList/EmptyList";
import AuthContext from "../../../../context/auth-context";

const HrRequestsList = () => {
    const [collaborator, setCollaborator] = useState<any>(null);
    // Forbidden conditions
    const {currentUser} = useContext(AuthContext);
    const currentUserId = currentUser?.id
    const [searchParams] = useSearchParams();
    const activeRole = useRole();
    const userIdParam = searchParams.get("user_id");
    const { user_id: userIdpathParam } = useParams();
    const effectiveUserId = activeRole === 'dua_user' ? currentUserId : (userIdParam!==null && userIdParam!=='null')  ? userIdParam : userIdpathParam;
    const forbiddenView =
        (activeRole === "scientific_supervisor" || activeRole === "project_manager" || activeRole === "president" || activeRole === "director" || activeRole === "supervisor_elke") &&
        // @ts-ignore
        (effectiveUserId === "" || effectiveUserId =="0" || effectiveUserId ==0 || effectiveUserId ==null);
    const InitParams = (): HrRequestParams => {
        const parsedUserId = effectiveUserId ? Number(effectiveUserId) : null;

        return {
            order: "DESC",
            order_by: "request_date",
            list_type: '1',
            page: forbiddenView ? 0 : 1,
            page_size: forbiddenView ? 0 : 10,
            request_types: [],
            search: '',
            role: activeRole,
            user_id: Number.isNaN(parsedUserId) ? null : parsedUserId,
        };
    };


    // Prevent real API calls when forbidden
    const safeGetRequests = async (
        params: HrRequestParams
    ): Promise<AxiosResponse<RecordsResponse<HrRequest>>> => {

        const rawUserId = params.user_id as unknown as string | number | null;
        const parsedUserId =
            rawUserId === null || rawUserId === 'null' || rawUserId === '' || rawUserId === 'NaN'
                ? null
                : Number.isNaN(Number(rawUserId)) ? null : Number(rawUserId);

        const sanitized: HrRequestParams = {
            ...params,
            page: Number(params.page) || 1,
            page_size: Number(params.page_size) || 10,
            user_id: parsedUserId,
            request_types: Array.isArray(params.request_types)
                ? params.request_types.filter(t => t !== '')
                : [],
        };

        if (forbiddenView || sanitized.page === 0) {
            return {
                data: {
                    records: [],
                    metadata: {
                        page: 1,
                        page_size: 0,
                        page_count: 0,
                        total_count: 0
                    },
                    counters: {}
                },
                status: 200,
                statusText: "OK",
                headers: {},
                config: {
                    headers: {},
                    url: "",
                    method: "get"
                } as InternalAxiosRequestConfig
            };
        }

        return getRequests(sanitized);
    };

    const [requests, requestsParams, setRequestsParams, fetchRequests] =
        useListControl<HrRequestParams, HrRequest>(InitParams(), safeGetRequests);

    const [requestTypes, setRequestTypes] = useState<HrRequestType[]>();

    const handleSearch = (s: string) => {
        setRequestsParams({
            ...requestsParams,
            page: 1,
            search: s
        });
    };

    const handleSelectChange = (value: string) => {
        setRequestsParams({
            ...requestsParams,
            list_type: value,
            page: 1,
        });
    };

    // Prevent fetching request types when forbidden
    useEffect(() => {
        if (forbiddenView) return;

        (async () => {
            try {
                const resp = await getRequestTypes();
                setRequestTypes(resp.data);
            } catch (error) {
                if (axios.isCancel(error)) return;
                console.error("Failed to fetch request types:", error);
            }
        })();
    }, [forbiddenView]);

    const didFetchCollaborator = React.useRef(false);

    useEffect(() => {
        if (didFetchCollaborator.current) return;
        if (!activeRole) return;
        if (forbiddenView) return;
        if (!userIdParam || userIdParam === '0') return;
        if (activeRole === 'hr_manager') return;

        didFetchCollaborator.current = true;

        (async () => {
            try {
                if (activeRole === 'dua_user') {
                    const resp = getMyEmployeeOverview(userIdParam); // ⚠️ missing await btw
                    setCollaborator(resp);
                } else {
                    const resp = await getCollaborator(userIdParam);
                    setCollaborator(resp.data);
                }
            } catch (err) {
                if (axios.isCancel(err)) return; // add this line
                console.error("Failed to fetch collaborator:", err);
                setCollaborator(null);
            }
        })();
    }, [userIdParam, forbiddenView, activeRole]);

    // If forbidden, stop rendering everything
    if (forbiddenView) {
        return (
            <div className="requests-list text-center py-5">
                <EmptyList>
                    Δεν υπάρχουν δεδομένα εδώ. Μεταβείτε στη σελίδα από την καρτέλα ενός συνεργάτη για να δείτε σχετικές εγγραφές.
                </EmptyList>
            </div>
        );
    }

    return (
        <div className={'requests-list'}>
            <div className="search-wrapper row mb-5 gap-4">
                <div className="col">
                    <SearchBar
                        hasSearch={userIdParam == ''}
                        onSearch={handleSearch}
                        placeholder={`Αναζητήστε με βάση τον Επιστημονικό Υπεύθυνο, το Όνομα, το Επώνυμο υπαλλήλου ή το Email Account (${requests?.metadata.total_count})`}
                        value={requestsParams.search ?? ''}
                    >
                        <CustomRadioSelect
                            theme={"search-listbox"}
                            value={requestsParams.list_type}
                            handleChange={(value) => handleSelectChange(value)}
                        >
                            <SelectItem value={'1'}>
                                <span>Όλες οι Ενέργειες</span>
                            </SelectItem>
                            <SelectItem value={'2'}>
                                <span>Σε εξέλιξη</span>
                            </SelectItem>
                            <SelectItem value={'3'}>
                                <span>Ολοκληρώθηκε</span>
                            </SelectItem>
                            <SelectItem value={'4'}>
                                <span>Ακυρώθηκε</span>
                            </SelectItem>
                            <SelectItem value={'5'}>
                                <span>Σφάλμα</span>
                            </SelectItem>
                            <SelectItem value={'6'}>
                                <span>Κάρτα έτοιμη</span>
                            </SelectItem>
                        </CustomRadioSelect>
                        {collaborator && <p>{collaborator.user.firstname +' '+collaborator.user.lastname}</p>}
                    </SearchBar>
                </div>
            </div>

            <div className="d-flex mb-5">
                {requests && (requests.records.length !== 0 || requests.records.length === undefined) &&
                    <HrRequestsFilters
                        counters={requests && requests.counters}
                        request_types={requestTypes}
                        selectedRequestTypes={requestsParams.request_types}
                        setFilteredTypes={(newTypes) => setRequestsParams({
                            ...requestsParams,
                            page: 1,
                            request_types: newTypes
                        })}
                    />}
            </div>

            <div className={'mb-5'}>
                {requests &&
                    <RequestsList
                        orderParams={{
                            order: requestsParams.order,
                            order_by: requestsParams.order_by,
                            setOrder: (order_by: string, order: Order) => {
                                setRequestsParams({
                                    ...requestsParams,
                                    order: order,
                                    order_by: order_by
                                });
                            }
                        }}
                        pagination={{
                            meta: requests.metadata,
                            setPage: (p: number) => {
                                setRequestsParams({
                                    ...requestsParams,
                                    page: p
                                });
                            },
                            setPerPage: (p: number) => {
                                setRequestsParams({
                                    ...requestsParams,
                                    page: 1,
                                    page_size: p
                                });
                            },
                            lastFetched: requests?.last_fetched
                        }}
                        requests={requests}
                        updateRequests={fetchRequests}
                    />
                }
            </div>

        </div>
    );
}

export default HrRequestsList;
