/**
   * Attempts to import a new invoice into the associated FreeAgent account by deserialising the
   * specified JSON invoice information and requesting a new invoice be created.
   *
   * <p>NOTE: The import (creation within FreeAgent) will only be actioned if no URL property is
   * present or if the URL property is not populated. Otherwise null will be returned.
   *
   * @param invoiceJSON A string containing invoice information in FreeAgent friendly format.
   * @return The newly populated invoice instance that has been imported into FreeAgent or null.
   * @throws JsonSyntaxException If the format does not match the FreeAgent V2 Invoice format.
   */
  public FreeAgentInvoice importInvoice(String invoiceJSON) throws JsonSyntaxException {
    if (invoiceJSON == null || invoiceJSON.isEmpty()) {
      return null;
    }

    FreeAgentInvoice invoice = buildInvoice(invoiceJSON);

    if (invoice != null && (invoice.getUrl() == null || invoice.getUrl().isEmpty())) {
      FreeAgentInvoiceWrapper invoiceWrapper =
          freeAgentServiceInstance.createInvoice(new FreeAgentInvoiceWrapper(invoice));

      if (invoiceWrapper != null) {
        return invoiceWrapper.getInvoice();
      }
    }

    return null;
  }
  /**
   * Attempts to delete the specified invoice entry in the associated FreeAgent account.
   *
   * @param invoice The populated invoice instance.
   * @return True if the invoice has been deleted successfully, otherwise false.
   */
  public boolean deleteInvoice(FreeAgentInvoice invoice) {
    if (invoice != null) {
      String invoiceId = extractIdentifier(invoice.getUrl());

      if (invoiceId != null && !invoiceId.isEmpty()) {
        Response response = freeAgentServiceInstance.deleteInvoice(invoiceId);

        if (response.getStatus() == 200) {
          return true;
        } else {
          return false;
        }
      }
    }
    return false;
  }
  /**
   * Attempts to update the specified invoice entry in the associated FreeAgent account.
   *
   * @param invoice The populated Invoice instance.
   * @return True if the invoice has been updated successfully, otherwise false.
   */
  public boolean updateInvoice(FreeAgentInvoice invoice) {
    if (invoice != null) {
      String invoiceId = extractIdentifier(invoice.getUrl());

      if (invoiceId != null && !invoiceId.isEmpty()) {
        Response response =
            freeAgentServiceInstance.updateInvoice(new FreeAgentInvoiceWrapper(invoice), invoiceId);
        if (response.getStatus() == 200) {
          invoice.setUpdatedAt(dateFormat.format(new Date()));
          return true;
        } else {
          return false;
        }
      }
    }
    return false;
  }