///|
pub(all) enum Platform {
  Wechat
  Alipay
  TikTok
} derive(Debug, Eq)

///|
pub impl Show for Platform with fn output(self : Platform, logger : &Logger) -> Unit {
  logger.write_string(platform_id(self))
}

///|
pub struct PlatformAdapter {
  platform : Platform
  id : String
  page_component : String
  tap_event : String
  component_prefix : String
  app_launch_lifecycle : String
  page_load_lifecycle : String
  page_ready_lifecycle : String
  request_api : String
  supports_canvas : Bool
  supports_cloud : Bool
  supports_stream : Bool
} derive(Debug, Eq)

///|
pub impl Show for PlatformAdapter with fn output(
  self : PlatformAdapter,
  logger : &Logger,
) -> Unit {
  logger.write_string(
    "PlatformAdapter(id=\{self.id}, page_component=\{self.page_component}, tap_event=\{self.tap_event}, app_launch=\{self.app_launch_lifecycle}, page_load=\{self.page_load_lifecycle}, page_ready=\{self.page_ready_lifecycle}, request=\{self.request_api}, canvas=\{self.supports_canvas}, cloud=\{self.supports_cloud}, stream=\{self.supports_stream})",
  )
}

///|
pub fn platform_id(platform : Platform) -> String {
  match platform {
    Wechat => "wechat"
    Alipay => "alipay"
    TikTok => "tiktok"
  }
}

///|
pub fn platform_label(platform : Platform) -> String {
  match platform {
    Wechat => "WeChat Mini Program"
    Alipay => "Alipay Mini Program"
    TikTok => "TikTok Mini App"
  }
}

///|
pub fn platform_adapter(
  platform~ : Platform,
  id~ : String,
  page_component~ : String,
  tap_event~ : String,
  component_prefix? : String = "",
  app_launch_lifecycle? : String = "onLaunch",
  page_load_lifecycle? : String = "onLoad",
  page_ready_lifecycle? : String = "onReady",
  request_api? : String = "request",
  supports_canvas? : Bool = true,
  supports_cloud? : Bool = false,
  supports_stream? : Bool = true,
) -> PlatformAdapter {
  {
    platform,
    id,
    page_component,
    tap_event,
    component_prefix,
    app_launch_lifecycle,
    page_load_lifecycle,
    page_ready_lifecycle,
    request_api,
    supports_canvas,
    supports_cloud,
    supports_stream,
  }
}

///|
pub fn adapter(platform : Platform) -> PlatformAdapter {
  match platform {
    Wechat =>
      platform_adapter(
        platform~,
        id=platform_id(platform),
        page_component="page",
        tap_event="bindtap",
        request_api="wx.request",
        supports_cloud=true,
      )
    Alipay =>
      platform_adapter(
        platform~,
        id=platform_id(platform),
        page_component="page",
        tap_event="onTap",
        component_prefix="a:",
        request_api="my.request",
        supports_cloud=true,
      )
    TikTok =>
      platform_adapter(
        platform~,
        id=platform_id(platform),
        page_component="page",
        tap_event="bindtap",
        component_prefix="tt:",
        request_api="tt.request",
      )
  }
}

///|
pub fn supported_platforms() -> Array[Platform] {
  [Wechat, Alipay, TikTok]
}