///|
pub(all) struct Status {
  id : String
  uri : String
  url : String?
  account : Account
  content : String
  /// Pleroma/Akkoma's optional plain-text rendering.
  plain_content : String?
  created_at : String
  spoiler_text : String
  sensitive : Bool
  visibility : StatusVisibility
  raw : Json
} derive(Eq, Debug)

///|
pub fn Status::from_json(json : Json) -> Status raise @api.MegalodonError {
  let fields = object_of(json, "Status")
  guard fields.get("account") is Some(account) else {
    raise @api.InvalidEntity(entity="Status", detail="missing account")
  }
  {
    id: required_string(fields, "id", "Status"),
    uri: required_string(fields, "uri", "Status"),
    url: optional_string(fields, "url"),
    account: Account::from_json(account),
    content: required_string(fields, "content", "Status"),
    plain_content: pleroma_plain_content(fields),
    created_at: required_string(fields, "created_at", "Status"),
    spoiler_text: required_string(fields, "spoiler_text", "Status"),
    sensitive: required_bool(fields, "sensitive", "Status"),
    visibility: StatusVisibility::parse(
      required_string(fields, "visibility", "Status"),
    ),
    raw: json,
  }
}

///|
fn pleroma_plain_content(fields : Map[String, Json]) -> String? {
  guard fields.get("pleroma") is Some(Object(pleroma)) else { return None }
  guard pleroma.get("content") is Some(Object(content)) else { return None }
  match content.get("text/plain") {
    Some(String(value)) => Some(value)
    _ => None
  }
}

///|
pub fn Status::to_json(self : Self) -> Json {
  self.raw
}

///|
pub(all) struct StatusParams {
  text : String
  spoiler_text : String?
  sensitive : Bool?
  language : String?
} derive(Eq, Debug)