// This program has been developed by students from the bachelor Computer Science at Utrecht
// University within the Software Project course.
// © Copyright Utrecht University (Department of Information and Computing Sciences)
import {
  Handle,
  type HandleProps,
  type Connection,
  useNodeId, useNodeConnections
} from '@xyflow/react';
import { type HandleRule, useHandleRules} from "../HandleRuleLogic.ts";
import "./RuleBasedHandle.module.css";



export function MultiConnectionHandle({
  id,
  type,
  rules = [],
  ...otherProps
} : HandleProps & { rules?: HandleRule[]}) {
  let nodeId = useNodeId();
  // this check is used to make sure that the handle code doesn't break when used inside a test,
  // since useNodeId would be undefined if the handle is not used inside a node
  nodeId = nodeId ? nodeId : "mockId";
  const validate = useHandleRules(nodeId, id!, type!, rules);


  const connections = useNodeConnections({
    id: nodeId,
    handleType: type,
    handleId: id!
  })

  return (
    <Handle
      {...otherProps}
      id={id}
      type={type}
      className={"multiConnectionHandle" + (connections.length === 0 ? " unconnected" : " connected") + ` ${type}`}
      isValidConnection={(connection) => {
        const result = validate(connection as Connection);
        return result.isSatisfied;
      }}
    />
  );
}

export function SingleConnectionHandle({
  id,
  type,
  rules = [],
  ...otherProps
} : HandleProps & { rules?: HandleRule[]}) {
  let nodeId = useNodeId();
  // this check is used to make sure that the handle code doesn't break when used inside a test,
  // since useNodeId would be undefined if the handle is not used inside a node
  nodeId = nodeId ? nodeId : "mockId";
  const validate = useHandleRules(nodeId, id!, type!, rules);

  const connections = useNodeConnections({
    id: nodeId,
    handleType: type,
    handleId: id!
  })


  return (
    <Handle
      {...otherProps}
      id={id}
      type={type}
      className={"singleConnectionHandle" + (connections.length === 0 ? " unconnected" : " connected") + ` ${type}`}
      isConnectable={connections.length === 0}
      isValidConnection={(connection) => {
        const result = validate(connection as Connection);
        return result.isSatisfied;
      }}
    />
  );
}

