// m [pubKeys ...] n OP_CHECKMULTISIG

import { Stack } from '../../payments';
import * as bscript from '../../script';
import { OPS } from '../../script';
import * as types from '../../types';
const OP_INT_BASE = OPS.OP_RESERVED; // OP_1 - 1

export function check(
  script: Buffer | Stack,
  allowIncomplete?: boolean,
): boolean {
  const chunks = bscript.decompile(script) as Stack;

  if (chunks.length < 4) return false;
  if (chunks[chunks.length - 1] !== OPS.OP_CHECKMULTISIG) return false;
  if (!types.Number(chunks[0])) return false;
  if (!types.Number(chunks[chunks.length - 2])) return false;
  const m = (chunks[0] as number) - OP_INT_BASE;
  const n = (chunks[chunks.length - 2] as number) - OP_INT_BASE;

  if (m <= 0) return false;
  if (n > 16) return false;
  if (m > n) return false;
  if (n !== chunks.length - 3) return false;
  if (allowIncomplete) return true;

  const keys = chunks.slice(1, -2) as Buffer[];
  return keys.every(bscript.isCanonicalPubKey);
}
check.toJSON = (): string => {
  return 'multi-sig output';
};