/**
 *
 * Copyright 2023-2025 InspectorRAGet Team
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 **/

'use client';

import { createContext, useContext, useState, useRef } from 'react';
import { ToastNotification } from '@carbon/react';

import { Notification as NotificationType } from '@/src/types';

import styles from './Notification.module.scss';

type NotificationContextType = {
  createNotification(notification: NotificationType, timeout?: number): void;
};

const NotificationContext = createContext<NotificationContextType | undefined>(
  undefined,
);

const NotificationComponent = ({
  title,
  subtitle,
  kind,
  caption,
}: NotificationType) => (
  <ToastNotification
    hideCloseButton={true}
    className={styles.notification}
    closeOnEscape={false}
    title={title}
    kind={kind}
    subtitle={subtitle}
    caption={caption}
  />
);

export const NotificationProvider = ({ children }: { children: any }) => {
  const [notification, setNotification] = useState<
    NotificationType | undefined
  >();
  const timeoutId = useRef<NodeJS.Timeout | undefined>();

  const createNotification = (
    notification: NotificationType,
    timeout?: number,
  ) => {
    if (timeoutId.current) {
      clearTimeout(timeoutId.current);
    }
    setNotification(notification);
    timeoutId.current = setTimeout(
      () => {
        setNotification(undefined);
      },
      timeout ? timeout : 5000,
    );
  };

  return (
    <NotificationContext.Provider value={{ createNotification }}>
      {children}
      {notification && <NotificationComponent {...notification} />}
    </NotificationContext.Provider>
  );
};

export const useNotification = () => {
  const context = useContext(NotificationContext);
  if (context === undefined) {
    throw new Error(
      'useNotification must be used within a NotificationProvider',
    );
  }
  return context;
};