/**
 * @name ICloudinaryAssetConfigurations
 * @summary config
 * @description Defines the configuration needed for URL-related options when creating Cloudinary URL
 * <b>Learn more:</b> {@link https://cloudinary.com/documentation/cloudinary_sdks#configuration_parameters|URL Parameters}
 * @prop {string}  [cname]
 * @prop {string} [secureDistribution]
 * @prop {boolean} [privateCdn]
 * @prop {boolean} [signUrl]
 * @prop {boolean} [longUrlSignature]
 * @prop {boolean} [shorten]
 * @prop {boolean} [useRootPath]
 * @prop {boolean} [secure]
 * @prop {boolean} [forceVersion]
 * @prop {boolean} [analytics]
 * @prop {object|string} [queryParams]  
 * @example
 * import Cloudinary from '@cloudinary/url-gen';
 * // The Cloudinary Instance accepts a URLConfig under the `url` key
 * const cld = new Cloudinary({
 *  // the cloudConfig
 *  cloud: {
 *       cloudName: 'demo'
 *   },
 *   // the urlConfig
 *   url: {
 *       cname: 'www.example.com',
 *       forceVersion: true
 *   }
 * });
 */
interface IURLConfig {
  /**
   * Replace the asset domain when secure is false
   * http://{cname}/{cloudName}/image/upload
   */
  cname?: string;

  /**
   * Replace the asset domain when secure is true
   * https://{cname}/{cloudName}/image/upload
   */
  secureDistribution?: string;

  /**
   * When Cname or secureDistribution are provided (with secure accordingly),
   * privateCdn removes the cloudName from the URL:
   *
   * https://{cname|secureDistribution}/image/upload
   * instead of
   * https://{cname|secureDistribution}/{cloudName}image/upload
   *
   * When privateCdn is provided without cname or secure distribution,
   * it moves the cloudName from the URL to the domain:
   *
   * https://{cloudName}-res.cloudinary.com/image/upload
   * instead of
   * https://res.cloudinary.com/{cloudName}/image/upload
   */
  privateCdn?: boolean;

  /**
   * use HTTPS or HTTP
   */
  secure?: boolean;


  /**
   * Whether or not to include the SDK version signature in the URL
   */
  analytics?: boolean;

  /**
   * Whether or not to sign the URL
   */
  signUrl?: boolean;

  /**
   * Whether or not to use a long signature
   */
  longUrlSignature?: boolean;

  /**
   * Whether or not to shorten the URL
   */
  shorten?: boolean;

  /**
   * Whether or not to use the root path
   */
  useRootPath?: boolean;

  /**
   * Whether or not to force a version
   */
  forceVersion?: boolean;

  /**
   * Additional params to be added to the URL
   */
  queryParams?: Record<string, string | number | boolean> | string
}

export default IURLConfig;