// Generated from WebIDL - DO NOT EDIT
// Source: @webref/idl/attribution

///|
/// AttributionAggregationProtocol enum
pub(all) enum AttributionAggregationProtocol {
  Dap15Histogram
} derive(Eq, Show)

///|
/// Convert to string value
pub fn AttributionAggregationProtocol::to_string(
  self : AttributionAggregationProtocol,
) -> String {
  match self {
    AttributionAggregationProtocol::Dap15Histogram => "dap-15-histogram"
  }
}

///|
/// Parse from string value
pub fn AttributionAggregationProtocol::from_string(
  s : String,
) -> AttributionAggregationProtocol? {
  match s {
    "dap-15-histogram" => Some(AttributionAggregationProtocol::Dap15Histogram)
    _ => None
  }
}

///|
/// AttributionAggregationService dictionary
pub(all) struct AttributionAggregationService {
  protocol : AttributionAggregationProtocol
}

///|
/// Create a new AttributionAggregationService
pub fn AttributionAggregationService::new(
  protocol~ : AttributionAggregationProtocol,
) -> AttributionAggregationService {
  AttributionAggregationService::{ protocol, }
}

///|
extern "js" fn AttributionAggregationService::to_js_ffi(
  self : AttributionAggregationService,
) -> JsValue =
  #| (self) => ({
  #|   protocol: ['dap-15-histogram'][self.protocol]
  #| })

///|
/// Convert to JsValue
pub fn AttributionAggregationService::to_js(
  self : AttributionAggregationService,
) -> JsValue {
  AttributionAggregationService::to_js_ffi(self)
}

///|
extern "js" fn AttributionAggregationService::from_js_ffi(
  value : JsValue,
) -> AttributionAggregationService =
  #| (v) => ({
  #|   protocol: ['dap-15-histogram'].indexOf(v.protocol)
  #| })

///|
/// Convert from JsValue
pub fn AttributionAggregationService::from_js(
  value : JsValue,
) -> AttributionAggregationService {
  AttributionAggregationService::from_js_ffi(value)
}

///|
/// AttributionImpressionOptions dictionary
pub(all) struct AttributionImpressionOptions {
  histogramIndex : Int
  matchValue : Int?
  conversionSites : Array[String]?
  conversionCallers : Array[String]?
  lifetimeDays : Int?
  priority : Int?
}

///|
/// Create a new AttributionImpressionOptions with default values
pub fn AttributionImpressionOptions::default() -> AttributionImpressionOptions {
  AttributionImpressionOptions::{
    histogramIndex: 0,
    matchValue: None,
    conversionSites: None,
    conversionCallers: None,
    lifetimeDays: None,
    priority: None,
  }
}

///|
extern "js" fn AttributionImpressionOptions::to_js_ffi(
  self : AttributionImpressionOptions,
) -> JsValue =
  #| (self) => ({
  #|   histogramIndex: self.histogramIndex,
  #|   matchValue: self.matchValue,
  #|   conversionSites: ((() => { const v = self.conversionSites; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })()),
  #|   conversionCallers: ((() => { const v = self.conversionCallers; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })()),
  #|   lifetimeDays: self.lifetimeDays,
  #|   priority: self.priority
  #| })

///|
/// Convert to JsValue
pub fn AttributionImpressionOptions::to_js(
  self : AttributionImpressionOptions,
) -> JsValue {
  AttributionImpressionOptions::to_js_ffi(self)
}

///|
extern "js" fn AttributionImpressionOptions::from_js_ffi(
  value : JsValue,
) -> AttributionImpressionOptions =
  #| (v) => ({
  #|   histogramIndex: v.histogramIndex,
  #|   matchValue: v.matchValue,
  #|   conversionSites: (v.conversionSites === undefined ? { $tag: 0 } : { $tag: 1, _0: v.conversionSites }),
  #|   conversionCallers: (v.conversionCallers === undefined ? { $tag: 0 } : { $tag: 1, _0: v.conversionCallers }),
  #|   lifetimeDays: v.lifetimeDays,
  #|   priority: v.priority
  #| })

///|
/// Convert from JsValue
pub fn AttributionImpressionOptions::from_js(
  value : JsValue,
) -> AttributionImpressionOptions {
  AttributionImpressionOptions::from_js_ffi(value)
}

///|
/// AttributionImpressionResult dictionary
pub(all) struct AttributionImpressionResult {}

///|
/// Create a new AttributionImpressionResult with default values
pub fn AttributionImpressionResult::default() -> AttributionImpressionResult {
  AttributionImpressionResult::{  }
}

///|
extern "js" fn AttributionImpressionResult::to_js_ffi(
  self : AttributionImpressionResult,
) -> JsValue =
  #| (self) => ({
  #| })

///|
/// Convert to JsValue
pub fn AttributionImpressionResult::to_js(
  self : AttributionImpressionResult,
) -> JsValue {
  AttributionImpressionResult::to_js_ffi(self)
}

///|
extern "js" fn AttributionImpressionResult::from_js_ffi(
  value : JsValue,
) -> AttributionImpressionResult =
  #| (v) => ({
  #| })

///|
/// Convert from JsValue
pub fn AttributionImpressionResult::from_js(
  value : JsValue,
) -> AttributionImpressionResult {
  AttributionImpressionResult::from_js_ffi(value)
}

///|
/// AttributionConversionOptions dictionary
pub(all) struct AttributionConversionOptions {
  aggregationService : String
  epsilon : Double?
  histogramSize : Int
  lookbackDays : Int?
  matchValues : Array[Int]?
  impressionSites : Array[String]?
  impressionCallers : Array[String]?
  credit : Array[Double]?
  value : Int?
  maxValue : Int?
}

///|
/// Create a new AttributionConversionOptions with default values
pub fn AttributionConversionOptions::default() -> AttributionConversionOptions {
  AttributionConversionOptions::{
    aggregationService: "",
    epsilon: None,
    histogramSize: 0,
    lookbackDays: None,
    matchValues: None,
    impressionSites: None,
    impressionCallers: None,
    credit: None,
    value: None,
    maxValue: None,
  }
}

///|
extern "js" fn AttributionConversionOptions::to_js_ffi(
  self : AttributionConversionOptions,
) -> JsValue =
  #| (self) => ({
  #|   aggregationService: self.aggregationService,
  #|   epsilon: ((() => { const v = self.epsilon; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })()),
  #|   histogramSize: self.histogramSize,
  #|   lookbackDays: self.lookbackDays,
  #|   matchValues: ((() => { const v = self.matchValues; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })()),
  #|   impressionSites: ((() => { const v = self.impressionSites; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })()),
  #|   impressionCallers: ((() => { const v = self.impressionCallers; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })()),
  #|   credit: ((() => { const v = self.credit; if (v === undefined || v.$tag !== 1) return undefined; return v._0; })()),
  #|   value: self.value,
  #|   maxValue: self.maxValue
  #| })

///|
/// Convert to JsValue
pub fn AttributionConversionOptions::to_js(
  self : AttributionConversionOptions,
) -> JsValue {
  AttributionConversionOptions::to_js_ffi(self)
}

///|
extern "js" fn AttributionConversionOptions::from_js_ffi(
  value : JsValue,
) -> AttributionConversionOptions =
  #| (v) => ({
  #|   aggregationService: v.aggregationService,
  #|   epsilon: (v.epsilon === undefined ? { $tag: 0 } : { $tag: 1, _0: v.epsilon }),
  #|   histogramSize: v.histogramSize,
  #|   lookbackDays: v.lookbackDays,
  #|   matchValues: (v.matchValues === undefined ? { $tag: 0 } : { $tag: 1, _0: v.matchValues }),
  #|   impressionSites: (v.impressionSites === undefined ? { $tag: 0 } : { $tag: 1, _0: v.impressionSites }),
  #|   impressionCallers: (v.impressionCallers === undefined ? { $tag: 0 } : { $tag: 1, _0: v.impressionCallers }),
  #|   credit: (v.credit === undefined ? { $tag: 0 } : { $tag: 1, _0: v.credit }),
  #|   value: v.value,
  #|   maxValue: v.maxValue
  #| })

///|
/// Convert from JsValue
pub fn AttributionConversionOptions::from_js(
  value : JsValue,
) -> AttributionConversionOptions {
  AttributionConversionOptions::from_js_ffi(value)
}

///|
/// AttributionConversionResult dictionary
pub(all) struct AttributionConversionResult {
  report : Uint8Array
}

///|
/// Create a new AttributionConversionResult
pub fn AttributionConversionResult::new(
  report~ : Uint8Array,
) -> AttributionConversionResult {
  AttributionConversionResult::{ report, }
}

///|
extern "js" fn AttributionConversionResult::to_js_ffi(
  self : AttributionConversionResult,
) -> JsValue =
  #| (self) => ({
  #|   report: self.report
  #| })

///|
/// Convert to JsValue
pub fn AttributionConversionResult::to_js(
  self : AttributionConversionResult,
) -> JsValue {
  AttributionConversionResult::to_js_ffi(self)
}

///|
extern "js" fn AttributionConversionResult::from_js_ffi(
  value : JsValue,
) -> AttributionConversionResult =
  #| (v) => ({
  #|   report: v.report
  #| })

///|
/// Convert from JsValue
pub fn AttributionConversionResult::from_js(
  value : JsValue,
) -> AttributionConversionResult {
  AttributionConversionResult::from_js_ffi(value)
}

///|
/// AttributionAggregationServices interface
pub type AttributionAggregationServices

///|
pub extern "js" fn AttributionAggregationServices::to_js_value(
  self : AttributionAggregationServices,
) -> JsValue =
  #| (self) => self

///|
/// Cast JsValue to AttributionAggregationServices (unchecked)
pub extern "js" fn AttributionAggregationServices::from_js_value(
  v : JsValue,
) -> AttributionAggregationServices =
  #| (v) => v

///|
/// Safely cast JsValue to AttributionAggregationServices (checked with instanceof)
pub extern "js" fn AttributionAggregationServices::from_js_value_opt(
  v : JsValue,
) -> AttributionAggregationServices? =
  #| (v) => (v instanceof AttributionAggregationServices) ? { $tag: 1, _0: v } : { $tag: 0 }

///|
/// Safely cast JsValue to AttributionAggregationServices (checked with instanceof)
pub extern "js" fn JsValue::as_attribution_aggregation_services(
  self : JsValue,
) -> AttributionAggregationServices? =
  #| (self) => (self instanceof AttributionAggregationServices) ? { $tag: 1, _0: self } : { $tag: 0 }

///|
/// Cast JsValue to AttributionAggregationServices (unchecked)
pub extern "js" fn JsValue::to_attribution_aggregation_services(
  self : JsValue,
) -> AttributionAggregationServices =
  #| (self) => self

///|
pub extern "js" fn AttributionAggregationServices::get(
  self : AttributionAggregationServices,
  key : String,
) -> AttributionAggregationService? =
  #| (self, key) => self.get(key)

///|
pub extern "js" fn AttributionAggregationServices::has(
  self : AttributionAggregationServices,
  key : String,
) -> Bool =
  #| (self, key) => self.has(key)

///|
/// Attribution interface
pub type Attribution

///|
pub extern "js" fn Attribution::to_js_value(self : Attribution) -> JsValue =
  #| (self) => self

///|
/// Cast JsValue to Attribution (unchecked)
pub extern "js" fn Attribution::from_js_value(v : JsValue) -> Attribution =
  #| (v) => v

///|
/// Safely cast JsValue to Attribution (checked with instanceof)
pub extern "js" fn Attribution::from_js_value_opt(v : JsValue) -> Attribution? =
  #| (v) => (v instanceof Attribution) ? { $tag: 1, _0: v } : { $tag: 0 }

///|
/// Safely cast JsValue to Attribution (checked with instanceof)
pub extern "js" fn JsValue::as_attribution(self : JsValue) -> Attribution? =
  #| (self) => (self instanceof Attribution) ? { $tag: 1, _0: self } : { $tag: 0 }

///|
/// Cast JsValue to Attribution (unchecked)
pub extern "js" fn JsValue::to_attribution(self : JsValue) -> Attribution =
  #| (self) => self

///|
pub extern "js" fn Attribution::get_aggregation_services(
  self : Attribution,
) -> AttributionAggregationServices =
  #| (self) => self.aggregationServices

///|
extern "js" fn Attribution::save_impression_ffi(
  self : Attribution,
  options : JsValue,
) -> Promise[AttributionImpressionResult] =
  #| (self, options) => self.saveImpression(options).then(v => ({
  #| }))

///|
pub fn Attribution::save_impression(
  self : Attribution,
  options : AttributionImpressionOptions,
) -> Promise[AttributionImpressionResult] {
  Attribution::save_impression_ffi(self, options.to_js())
}

///|
extern "js" fn Attribution::measure_conversion_ffi(
  self : Attribution,
  options : JsValue,
) -> Promise[AttributionConversionResult] =
  #| (self, options) => self.measureConversion(options).then(v => ({
  #|   report: v.report
  #| }))

///|
pub fn Attribution::measure_conversion(
  self : Attribution,
  options : AttributionConversionOptions,
) -> Promise[AttributionConversionResult] {
  Attribution::measure_conversion_ffi(self, options.to_js())
}