export default class TaxIdValidator {
  /**
   * 檢查發票號碼是否合法
   * @param invoiceId 發票號碼
   * @returns 是否合法
   */
  static isValid(invoiceId: string): boolean {
    const checkKey = [1, 2, 1, 2, 1, 2, 4, 1];
    let isum = 0;
    let isum1 = 0;
    let isum2 = 0;

    if (invoiceId.length !== 8 || isNaN(Number(invoiceId))) {
      return false;
    }

    for (let i = 0; i < 8; i++) {
      const currentDigit = parseInt(invoiceId.charAt(i), 10);
      const product = checkKey[i] * currentDigit;
      const a = Math.floor(product / 10);
      const b = product % 10;

      if (i === 6 && invoiceId.charAt(6) === '7') {
        isum1 = isum + 1;
        isum2 = isum;
      } else {
        isum += a + b;
      }
    }

    if (invoiceId.charAt(6) === '7') {
      const lastDigit = parseInt(invoiceId.charAt(7), 10);
      const product = checkKey[7] * lastDigit;
      const a = Math.floor(product / 10);
      const b = product % 10;

      isum1 += a + b;
      isum2 += a + b;

      return (
        TaxIdValidator.isValidChecksum(isum1) ||
        TaxIdValidator.isValidChecksum(isum2)
      );
    }

    return TaxIdValidator.isValidChecksum(isum);
  }

  private static isValidChecksum(sum: number): boolean {
    return sum - Math.round(sum / 5) * 5 === 0;
  }
}
