import{viewport}from"../enums.js";import getViewportRect from"./getViewportRect.js";import getDocumentRect from"./getDocumentRect.js";import listScrollParents from"./listScrollParents.js";import getOffsetParent from"./getOffsetParent.js";import getDocumentElement from"./getDocumentElement.js";import getComputedStyle from"./getComputedStyle.js";import{isElement,isHTMLElement}from"./instanceOf.js";import getBoundingClientRect from"./getBoundingClientRect.js";import getParentNode from"./getParentNode.js";import contains from"./contains.js";import getNodeName from"./getNodeName.js";import rectToClientRect from"../utils/rectToClientRect.js";import{max,min}from"../utils/math.js";function getInnerBoundingClientRect(t,e){e=getBoundingClientRect(t,!1,"fixed"===e);return e.top=e.top+t.clientTop,e.left=e.left+t.clientLeft,e.bottom=e.top+t.clientHeight,e.right=e.left+t.clientWidth,e.width=t.clientWidth,e.height=t.clientHeight,e.x=e.left,e.y=e.top,e}function getClientRectFromMixedType(t,e,o){return e===viewport?rectToClientRect(getViewportRect(t,o)):isElement(e)?getInnerBoundingClientRect(e,o):rectToClientRect(getDocumentRect(getDocumentElement(t)))}function getClippingParents(t){var e=listScrollParents(getParentNode(t)),o=0<=["absolute","fixed"].indexOf(getComputedStyle(t).position)&&isHTMLElement(t)?getOffsetParent(t):t;return isElement(o)?e.filter(function(t){return isElement(t)&&contains(t,o)&&"body"!==getNodeName(t)}):[]}export default function getClippingRect(o,t,e,n){t="clippingParents"===t?getClippingParents(o):[].concat(t),t=[].concat(t,[e]),e=t[0],t=t.reduce(function(t,e){e=getClientRectFromMixedType(o,e,n);return t.top=max(e.top,t.top),t.right=min(e.right,t.right),t.bottom=min(e.bottom,t.bottom),t.left=max(e.left,t.left),t},getClientRectFromMixedType(o,e,n));return t.width=t.right-t.left,t.height=t.bottom-t.top,t.x=t.left,t.y=t.top,t}