import React, {useContext, useEffect} from "react";
import {useNavigate, useParams} from "react-router-dom";
import AuthContext from "../context/auth-context";
import {Microservice} from "../models/EgovUser";
import BreadcrumbsContext from "../context/breadcrumbs-context";
import useTranslations from "../hooks/useTranslations";
import ExtraAuthProtection from "./ExtraAuthProtection";
import {useEncodedParams} from "../hooks/useEncodedParams";
import {encodeParams} from "../helpers/encodedParams";
import lazyWithRetry from '../utils/lazyWithRetry';

const RiviewReports = lazyWithRetry(() => import("../components/Riview/RiviewReports/RiviewReports"))
const RiviewStatistics = lazyWithRetry(() => import("../components/Riview/RiviewStatistics/RiviewStatistics"))
const RescomStatistics = lazyWithRetry(() => import("../components/Rescom/RescomStatistics/RescomStatistics"))
const RescomContracts = lazyWithRetry(() => import("../components/Rescom/RescomContracts/RescomContracts"))
const Collaborators = lazyWithRetry(() => import("../components/Rescom/RescomCollaborators/Collaborators"))
const DuaUserPersonalFolderOverview = lazyWithRetry(() => import("../components/Rescom/RescomCollaborators/CollaboratorFolderView/DuaUserPersonalFolderOverview"))
const RescomProjects = lazyWithRetry(() => import("../components/Rescom/RescomProjects/RescomProjects"))
const Protocol = lazyWithRetry(() => import("../components/PapyrosProtocol/Protocol"))
const NotificationsMeeting = lazyWithRetry(() => import("../components/NotificationsMeeting/NotificationsMeeting"))
const DPassInvitations = lazyWithRetry(() => import("../components/DPASS/InvitationsManagement/DPassInvitationsManagement"))
const DPassRequests = lazyWithRetry(() => import("../components/DPASS/RequestsManagement/DPassRequests"))
const DpassVisitsManagement = lazyWithRetry(() => import("../components/DPASS/VisitsManagement/DPassVisitsManagement"))
const SupportTicket = lazyWithRetry(() => import("../components/Support/SupportTicket/SupportTicket"))
const ContactsUpdate = lazyWithRetry(() => import("../components/Contacts/ContactsUpdate/ContactsUpdate"))
const ContactsSearch = lazyWithRetry(() => import("../components/Contacts/ContactsSearch/ContactsSearch"))
const NetSupportAccountRequests = lazyWithRetry(() => import("../components/NetSupport/AccountRequests/NetSupportAccountRequests"))
const NetSupportEmailAccounts = lazyWithRetry(() => import("../components/NetSupport/EmailAccounts/NetSupportEmailAccounts"))
const PersonnelManagement = lazyWithRetry(() => import("../components/HrSupport/PersonnelManagement/PersonnelManagement"))
const HrSupportRequestsManagement = lazyWithRetry(() => import("../components/HrSupport/RequestsManagement/RequestsManagement"))
const PersonalFolderPicker = lazyWithRetry(() => import("../components/HrSupport/PersonalFolderPicker"))
const PermanentPersonnelManagement = lazyWithRetry(() => import("../components/HrSupport/PermanentPersonnelManagement/PermanentPersonnelManagement"))
const TimeSheets = lazyWithRetry(() => import("../components/Trials/TimeSheets"))
const DocumentsManagement = lazyWithRetry(() => import("../components/UI/DynamicForms/DocumentsManagement"))
const DigitalStamp = lazyWithRetry(() => import("../components/UI/DigitalStamp/DigitalStamp"))
const AenaRoot = lazyWithRetry(() => import("../components/Difo/Aena/AenaRoot"))
const PersonalFolderRoot = lazyWithRetry(() => import("../components/Difo/PersonalFolder/PersonalFolderRoot"))
const Programs = lazyWithRetry(() => import("../components/Applio/Programs/Programs"))
const ProgramRequests = lazyWithRetry(() => import("../components/Applio/Submissions/Submissions"))

const ServiceComponentMap = {
    "riview.reports": <RiviewReports/>,
    "riview.statistics": <RiviewStatistics/>,
    "rescom.statistics": <RescomStatistics/>,
    "rescom.simvaseis": <RescomContracts/>,
    "rescom.collaborators": <Collaborators/>,
    "rescom.personal_folder": <DuaUserPersonalFolderOverview/>,
    "rescom.erga": <RescomProjects/>,
    "papyros.protocol": <Protocol/>,
    "notification.meeting": <NotificationsMeeting/>,
    "dpass.invitations": <DPassInvitations/>,
    "dpass.requests": <DPassRequests/>,
    "dpass.visits_management": <DpassVisitsManagement/>,
    "support.ticket": <SupportTicket/>,
    "contacts.info": <ContactsUpdate/>,
    "contacts.search": <ContactsSearch/>,
    "net_support.account_requests": <NetSupportAccountRequests/>,
    "net_support.email_accounts": <NetSupportEmailAccounts/>,
    "hr_support.personnel_list": <PersonnelManagement/>,
    "hr_support.requests_management": <HrSupportRequestsManagement/>,
    "hr_support.personal_folder": <PersonalFolderPicker/>,
    "hr_support.permanent_personnel_management": <PermanentPersonnelManagement/>,
    "test.time_sheets": <TimeSheets/>,
    "documents.documents_management": <DocumentsManagement/>,
    "documents.digital_stamp": <DigitalStamp/>,
    "difo.alfa_ena":<AenaRoot/>,
    "difo.personal_folder": <PersonalFolderRoot/>,
    "applio.programs" : <Programs/>,
    "applio.submissions" : <ProgramRequests/>
}

const ServicePage = () => {
    const {application, service} = useParams();
    const navigate = useNavigate()
    const {currentUser, hasExtraAuth} = useContext(AuthContext)
    const msPerms = currentUser!.microservice_permissions
    const [params] = useEncodedParams()
    const activeRole = params.get("activeRole");
    // eslint-disable-next-line @typescript-eslint/no-unused-vars
    const {addBreadcrumb, newBreadcrumbs} = useContext(BreadcrumbsContext);
    const {translateMicroservice, translateModule} = useTranslations();

    // @ts-ignore
    const serv = activeRole && currentUser?.permissions[activeRole]?.[application + '.' + service]  // ✅ added ?.
    // @ts-ignore
    const requires_extra = serv && serv.extra_auth && serv.extra_auth.length > 0;

    useEffect(() => {
        if (application && application in msPerms) {
            const access = msPerms[application as Microservice]!.find(p => p.startsWith(`${activeRole}.${service}`))
            if (!access) navigate(`/applications/${application}/services`)
        } else {
            navigate('/applications')
        }

        const serviceID = application!.concat(".", service!);

        addBreadcrumb({
        // @ts-ignore
            text: translateMicroservice(application),
            link: `/applications/${application}/services`
        }, 1)


        addBreadcrumb({
            text: translateModule(serviceID) as string,
            link: `/applications/${application}/services/${service}?t=${encodeParams({ activeRole: activeRole ?? "" })}` }, 2)

        // eslint-disable-next-line react-hooks/exhaustive-deps
    }, [service])


    return (
        <>
            {
                !requires_extra ? ServiceComponentMap[`${application}.${service}` as keyof typeof ServiceComponentMap]

                    : hasExtraAuth ? ServiceComponentMap[`${application}.${service}` as keyof typeof ServiceComponentMap]

                        : (requires_extra && !hasExtraAuth) ? <ExtraAuthProtection/> : <div>what</div>
            }

        </>
    );
};

export default ServicePage;
