/*
 *
 *    Copyright (c) 2025 Project CHIP Authors
 *
 *    Licensed 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.
 */
#pragma once

#include <AllClustersExampleDeviceInfoProviderImpl.h>
#include <lib/core/DataModelTypes.h>
#include <lib/support/CHIPMem.h>
#include <platform/DeviceInfoProvider.h>

namespace chip {
namespace DeviceLayer {

class AllDevicesExampleDeviceInfoProviderImpl : public AllClustersExampleDeviceInfoProviderImpl
{
public:
    AllDevicesExampleDeviceInfoProviderImpl() = default;
    ~AllDevicesExampleDeviceInfoProviderImpl() override {}

    // Iterators
    SupportedLocalesIterator * IterateSupportedLocales() override;

    static AllDevicesExampleDeviceInfoProviderImpl & GetDefaultInstance();

protected:
    class AllDevicesSupportedLocalesIteratorImpl : public SupportedLocalesIterator
    {
    public:
        AllDevicesSupportedLocalesIteratorImpl() = default;
        size_t Count() override;
        bool Next(CharSpan & output) override;
        void Release() override { chip::Platform::Delete(this); }

    private:
        static constexpr size_t kNumSupportedLocales = 1;
        size_t mIndex                                = 0;
    };
};

} // namespace DeviceLayer
} // namespace chip
