/**
 * Copyright 2015 CANAL+ Group
 *
 * 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.
 */

import { be4toi, be8toi } from "../../../utils/byte_parsing";

/**
 * Find the offset for the first declaration of the given box in an isobmff.
 * Returns -1 if not found or if incomplete.
 *
 * This function does not throw or log in case of partial segments.
 * @param {Uint8Array} buf - the isobmff
 * @param {Number} wantedName
 * @returns {Number} - Offset where the box begins. -1 if not found.
 */
export default function findCompleteBox(buf: Uint8Array, wantedName: number): number {
  const len = buf.length;
  let i = 0;
  while (i + 8 <= len) {
    let size = be4toi(buf, i);

    if (size === 0) {
      size = len - i;
    } else if (size === 1) {
      if (i + 16 > len) {
        return -1;
      }
      size = be8toi(buf, i + 8);
    }

    if (isNaN(size) || size <= 0) {
      // should not happen
      return -1;
    }

    const name = be4toi(buf, i + 4);
    if (name === wantedName) {
      if (i + size <= len) {
        return i;
      }
      return -1;
    }
    i += size;
  }
  return -1;
}
