import { setObject, u16 } from './common2'

const POLY_TABLE = new Uint16Array([
  0x0000, 0x6F63, 0xDEC6, 0xB1A5, 0xD2EF, 0xBD8C, 0x0C29, 0x634A,
  0xCABD, 0xA5DE, 0x147B, 0x7B18, 0x1852, 0x7731, 0xC694, 0xA9F7,
  0xFA19, 0x957A, 0x24DF, 0x4BBC, 0x28F6, 0x4795, 0xF630, 0x9953,
  0x30A4, 0x5FC7, 0xEE62, 0x8101, 0xE24B, 0x8D28, 0x3C8D, 0x53EE,
  0x9B51, 0xF432, 0x4597, 0x2AF4, 0x49BE, 0x26DD, 0x9778, 0xF81B,
  0x51EC, 0x3E8F, 0x8F2A, 0xE049, 0x8303, 0xEC60, 0x5DC5, 0x32A6,
  0x6148, 0x0E2B, 0xBF8E, 0xD0ED, 0xB3A7, 0xDCC4, 0x6D61, 0x0202,
  0xABF5, 0xC496, 0x7533, 0x1A50, 0x791A, 0x1679, 0xA7DC, 0xC8BF,
  0x59C1, 0x36A2, 0x8707, 0xE864, 0x8B2E, 0xE44D, 0x55E8, 0x3A8B,
  0x937C, 0xFC1F, 0x4DBA, 0x22D9, 0x4193, 0x2EF0, 0x9F55, 0xF036,
  0xA3D8, 0xCCBB, 0x7D1E, 0x127D, 0x7137, 0x1E54, 0xAFF1, 0xC092,
  0x6965, 0x0606, 0xB7A3, 0xD8C0, 0xBB8A, 0xD4E9, 0x654C, 0x0A2F,
  0xC290, 0xADF3, 0x1C56, 0x7335, 0x107F, 0x7F1C, 0xCEB9, 0xA1DA,
  0x082D, 0x674E, 0xD6EB, 0xB988, 0xDAC2, 0xB5A1, 0x0404, 0x6B67,
  0x3889, 0x57EA, 0xE64F, 0x892C, 0xEA66, 0x8505, 0x34A0, 0x5BC3,
  0xF234, 0x9D57, 0x2CF2, 0x4391, 0x20DB, 0x4FB8, 0xFE1D, 0x917E,
  0xB382, 0xDCE1, 0x6D44, 0x0227, 0x616D, 0x0E0E, 0xBFAB, 0xD0C8,
  0x793F, 0x165C, 0xA7F9, 0xC89A, 0xABD0, 0xC4B3, 0x7516, 0x1A75,
  0x499B, 0x26F8, 0x975D, 0xF83E, 0x9B74, 0xF417, 0x45B2, 0x2AD1,
  0x8326, 0xEC45, 0x5DE0, 0x3283, 0x51C9, 0x3EAA, 0x8F0F, 0xE06C,
  0x28D3, 0x47B0, 0xF615, 0x9976, 0xFA3C, 0x955F, 0x24FA, 0x4B99,
  0xE26E, 0x8D0D, 0x3CA8, 0x53CB, 0x3081, 0x5FE2, 0xEE47, 0x8124,
  0xD2CA, 0xBDA9, 0x0C0C, 0x636F, 0x0025, 0x6F46, 0xDEE3, 0xB180,
  0x1877, 0x7714, 0xC6B1, 0xA9D2, 0xCA98, 0xA5FB, 0x145E, 0x7B3D,
  0xEA43, 0x8520, 0x3485, 0x5BE6, 0x38AC, 0x57CF, 0xE66A, 0x8909,
  0x20FE, 0x4F9D, 0xFE38, 0x915B, 0xF211, 0x9D72, 0x2CD7, 0x43B4,
  0x105A, 0x7F39, 0xCE9C, 0xA1FF, 0xC2B5, 0xADD6, 0x1C73, 0x7310,
  0xDAE7, 0xB584, 0x0421, 0x6B42, 0x0808, 0x676B, 0xD6CE, 0xB9AD,
  0x7112, 0x1E71, 0xAFD4, 0xC0B7, 0xA3FD, 0xCC9E, 0x7D3B, 0x1258,
  0xBBAF, 0xD4CC, 0x6569, 0x0A0A, 0x6940, 0x0623, 0xB786, 0xD8E5,
  0x8B0B, 0xE468, 0x55CD, 0x3AAE, 0x59E4, 0x3687, 0x8722, 0xE841,
  0x41B6, 0x2ED5, 0x9F70, 0xF013, 0x9359, 0xFC3A, 0x4D9F, 0x22FC,
])

/**
 * - poly: 0x6F63
 * - initial: 0x0000
 * - xorout: 0x0000
 * - refin: false
 * - refout: false
 */
export default function crc16lj1200 (buf: Uint8Array = new Uint8Array(), prev: number = 0x0000): number {
  u16[0] = prev // revert of refout and xorout
  for (const b of buf) u16[0] = POLY_TABLE[(u16[0] >>> 8) ^ b] ^ (u16[0] << 8)
  return u16[0]
}

setObject(globalThis, ['taichunmin', 'crc', 'crc16lj1200'], crc16lj1200)
