// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements.  See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership.  The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License.  You may obtain a copy of the License at
//
//   http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied.  See the License for the
// specific language governing permissions and limitations
// under the License.

/// Capability is used to describe what operations are supported
///  by the current Operator.
///
/// Via capability, we can know:
///
/// - Whether current Operator supports `read` or not.
/// - Whether current Operator supports `read` with if match or not.
/// - What's current Operator max supports batch operations count.
///
/// Add fields of Capabilities to be public and can be accessed directly.
#[napi]
pub struct Capability(opendal::Capability);

impl Capability {
    pub fn new(cap: opendal::Capability) -> Self {
        Self(cap)
    }
}

#[napi]
impl Capability {
    /// If operator supports stat.
    #[napi(getter)]
    pub fn stat(&self) -> bool {
        self.0.stat
    }

    /// If operator supports stat with if matched.
    #[napi(getter)]
    pub fn stat_with_if_match(&self) -> bool {
        self.0.stat_with_if_match
    }

    /// If operator supports stat with if not match.
    #[napi(getter)]
    pub fn stat_with_if_none_match(&self) -> bool {
        self.0.stat_with_if_none_match
    }

    /// If operator supports stat with if modified since.
    #[napi(getter)]
    pub fn stat_with_if_modified_since(&self) -> bool {
        self.0.stat_with_if_modified_since
    }

    /// If operator supports stat with if unmodified since.
    #[napi(getter)]
    pub fn stat_with_if_unmodified_since(&self) -> bool {
        self.0.stat_with_if_unmodified_since
    }

    /// If operator supports stat with versions.
    #[napi(getter)]
    pub fn stat_with_version(&self) -> bool {
        self.0.stat_with_version
    }

    /// If operator supports stat with override content type.
    #[napi(getter)]
    pub fn stat_with_override_content_type(&self) -> bool {
        self.0.stat_with_override_content_type
    }

    /// If operator supports stat with override cache control.
    #[napi(getter)]
    pub fn stat_with_override_cache_control(&self) -> bool {
        self.0.stat_with_override_cache_control
    }

    /// If operator supports stat with override content disposition.
    #[napi(getter)]
    pub fn stat_with_override_content_disposition(&self) -> bool {
        self.0.stat_with_override_content_disposition
    }

    /// If operator supports read.
    #[napi(getter)]
    pub fn read(&self) -> bool {
        self.0.read
    }

    /// If operator supports read with version.
    #[napi(getter)]
    pub fn read_with_version(&self) -> bool {
        self.0.read_with_version
    }

    /// If operator supports read with range.
    #[napi(getter)]
    pub fn read_with_if_modified_since(&self) -> bool {
        self.0.read_with_if_modified_since
    }

    /// If operator supports read with if unmodified since.
    #[napi(getter)]
    pub fn read_with_if_unmodified_since(&self) -> bool {
        self.0.read_with_if_unmodified_since
    }

    /// If operator supports read with if matched.
    #[napi(getter)]
    pub fn read_with_if_match(&self) -> bool {
        self.0.read_with_if_match
    }

    /// If operator supports read with if not match.
    #[napi(getter)]
    pub fn read_with_if_none_match(&self) -> bool {
        self.0.read_with_if_none_match
    }

    /// if operator supports read with override cache control.
    #[napi(getter)]
    pub fn read_with_override_cache_control(&self) -> bool {
        self.0.read_with_override_cache_control
    }

    /// if operator supports `read` with override content disposition.
    #[napi(getter)]
    pub fn read_with_override_content_disposition(&self) -> bool {
        self.0.read_with_override_content_disposition
    }

    /// if operator supports read with override content type.
    #[napi(getter)]
    pub fn read_with_override_content_type(&self) -> bool {
        self.0.read_with_override_content_type
    }

    /// If operator supports write.
    #[napi(getter)]
    pub fn write(&self) -> bool {
        self.0.write
    }

    /// If operator supports write can be called in multi times.
    #[napi(getter)]
    pub fn write_can_multi(&self) -> bool {
        self.0.write_can_multi
    }

    /// If operator supports write with empty content.
    #[napi(getter)]
    pub fn write_can_empty(&self) -> bool {
        self.0.write_can_empty
    }

    /// If operator supports write by append.
    #[napi(getter)]
    pub fn write_can_append(&self) -> bool {
        self.0.write_can_append
    }

    /// If operator supports write with content type.
    #[napi(getter)]
    pub fn write_with_content_type(&self) -> bool {
        self.0.write_with_content_type
    }

    /// If operator supports write with content disposition.
    #[napi(getter)]
    pub fn write_with_content_disposition(&self) -> bool {
        self.0.write_with_content_disposition
    }

    /// If operator supports write with cache control.
    #[napi(getter)]
    pub fn write_with_cache_control(&self) -> bool {
        self.0.write_with_cache_control
    }

    /// If operator supports write with content encoding.
    #[napi(getter)]
    pub fn write_with_content_encoding(&self) -> bool {
        self.0.write_with_content_encoding
    }

    /// If operator supports write with user metadata.
    #[napi(getter)]
    pub fn write_with_user_metadata(&self) -> bool {
        self.0.write_with_user_metadata
    }

    /// If operator supports write with if match.
    #[napi(getter)]
    pub fn write_with_if_match(&self) -> bool {
        self.0.write_with_if_match
    }

    /// If operator supports write with if none match.
    #[napi(getter)]
    pub fn write_with_if_none_match(&self) -> bool {
        self.0.write_with_if_none_match
    }

    /// If operator supports write with if not exists.
    #[napi(getter)]
    pub fn write_with_if_not_exists(&self) -> bool {
        self.0.write_with_if_not_exists
    }

    /// write_multi_max_size is the max size that services support in write_multi.
    ///
    /// For example, AWS S3 supports 5GiB as max in write_multi.
    #[napi(getter)]
    pub fn write_multi_max_size(&self) -> Option<usize> {
        self.0.write_multi_max_size
    }

    /// write_multi_min_size is the min size that services support in write_multi.
    ///
    /// For example, AWS S3 requires at least 5MiB in write_multi expect the last one.
    #[napi(getter)]
    pub fn write_multi_min_size(&self) -> Option<usize> {
        self.0.write_multi_min_size
    }
    /// write_total_max_size is the max size that services support in write_total.
    ///
    /// For example, Cloudflare D1 supports 1MB as max in write_total.
    #[napi(getter)]
    pub fn write_total_max_size(&self) -> Option<usize> {
        self.0.write_total_max_size
    }

    /// If operator supports create dir.
    #[napi(getter)]
    pub fn create_dir(&self) -> bool {
        self.0.create_dir
    }

    /// If operator supports delete.
    #[napi(getter)]
    pub fn delete(&self) -> bool {
        self.0.delete
    }

    /// If operator supports delete by version.
    #[napi(getter)]
    pub fn delete_with_version(&self) -> bool {
        self.0.delete_with_version
    }

    /// If operator supports copy.
    #[napi(getter)]
    pub fn copy(&self) -> bool {
        self.0.copy
    }

    /// If operator supports rename.
    #[napi(getter)]
    pub fn rename(&self) -> bool {
        self.0.rename
    }

    /// If operator supports list.
    #[napi(getter)]
    pub fn list(&self) -> bool {
        self.0.list
    }

    /// If backend supports list with limit.
    #[napi(getter)]
    pub fn list_with_limit(&self) -> bool {
        self.0.list_with_limit
    }

    /// If backend supports list with start after.
    #[napi(getter)]
    pub fn list_with_start_after(&self) -> bool {
        self.0.list_with_start_after
    }

    /// If backend supports list with recursive.
    #[napi(getter)]
    pub fn list_with_recursive(&self) -> bool {
        self.0.list_with_recursive
    }

    /// If backend supports list with versions.
    #[napi(getter)]
    pub fn list_with_versions(&self) -> bool {
        self.0.list_with_versions
    }

    /// If backend supports list with deleted.
    #[napi(getter)]
    pub fn list_with_deleted(&self) -> bool {
        self.0.list_with_deleted
    }

    /// If operator supports presign.
    #[napi(getter)]
    pub fn presign(&self) -> bool {
        self.0.presign
    }

    /// If operator supports presign read.
    #[napi(getter)]
    pub fn presign_read(&self) -> bool {
        self.0.presign_read
    }

    /// If operator supports presign stat.
    #[napi(getter)]
    pub fn presign_stat(&self) -> bool {
        self.0.presign_stat
    }

    /// If operator supports presign write.
    #[napi(getter)]
    pub fn presign_write(&self) -> bool {
        self.0.presign_write
    }

    /// If operator supports shared.
    #[napi(getter)]
    pub fn shared(&self) -> bool {
        self.0.shared
    }
}
