use gix_features::zlib;

impl crate::Bundle {
    /// Find an object with the given [`ObjectId`](gix_hash::ObjectId) and place its data into `out`.
    /// `inflate` is used to decompress objects, and will be reset before first use, but not after the last use.
    ///
    /// [`cache`](crate::cache::DecodeEntry) is used to accelerate the lookup.
    ///
    /// **Note** that ref deltas are automatically resolved within this pack only, which makes this implementation unusable
    /// for thin packs, which by now are expected to be resolved already.
    pub fn find<'a>(
        &self,
        id: &gix_hash::oid,
        out: &'a mut Vec<u8>,
        inflate: &mut zlib::Inflate,
        cache: &mut dyn crate::cache::DecodeEntry,
    ) -> Result<Option<(gix_object::Data<'a>, crate::data::entry::Location)>, crate::data::decode::Error> {
        let idx = match self.index.lookup(id) {
            Some(idx) => idx,
            None => return Ok(None),
        };
        self.get_object_by_index(idx, out, inflate, cache).map(Some)
    }

    /// Special-use function to get an object given an index previously returned from
    /// [index::File::](crate::index::File::lookup()).
    /// `inflate` is used to decompress objects, and will be reset before first use, but not after the last use.
    ///
    /// # Panics
    ///
    /// If `index` is out of bounds.
    pub fn get_object_by_index<'a>(
        &self,
        idx: u32,
        out: &'a mut Vec<u8>,
        inflate: &mut zlib::Inflate,
        cache: &mut dyn crate::cache::DecodeEntry,
    ) -> Result<(gix_object::Data<'a>, crate::data::entry::Location), crate::data::decode::Error> {
        let ofs = self.index.pack_offset_at_index(idx);
        let pack_entry = self.pack.entry(ofs);
        let header_size = pack_entry.header_size();
        self.pack
            .decode_entry(
                pack_entry,
                out,
                inflate,
                &|id, _out| {
                    self.index.lookup(id).map(|idx| {
                        crate::data::decode::entry::ResolvedBase::InPack(
                            self.pack.entry(self.index.pack_offset_at_index(idx)),
                        )
                    })
                },
                cache,
            )
            .map(move |r| {
                (
                    gix_object::Data {
                        kind: r.kind,
                        data: out.as_slice(),
                    },
                    crate::data::entry::Location {
                        pack_id: self.pack.id,
                        pack_offset: ofs,
                        entry_size: r.compressed_size + header_size,
                    },
                )
            })
    }
}
