//
// Copyright (C) 2019 The Android Open Source Project
//
// 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.
//

#include <string>

#include <android-base/logging.h>

#include "../parser.h"
#include "../service.h"
#include "../service_list.h"
#include "../service_parser.h"
#include "include/init-test-utils/service_utils.h"

namespace android {
namespace init {

android::base::Result<ServiceInterfacesMap> GetOnDeviceServiceInterfacesMap() {
    ServiceList& service_list = ServiceList::GetInstance();
    Parser parser;
    parser.AddSectionParser("service",
                            std::make_unique<ServiceParser>(&service_list, nullptr, std::nullopt));
    for (const auto& location : {
                 "/init.rc",
                 "/system/etc/init",
                 "/system_ext/etc/init",
                 "/product/etc/init",
                 "/odm/etc/init",
                 "/vendor/etc/init",
         }) {
        parser.ParseConfig(location);
    }

    ServiceInterfacesMap result;
    for (const auto& service : service_list.services()) {
        // Create an entry for all services, including services that may not
        // have any declared interfaces.
        result[service->name()] = service->interfaces();
    }
    return result;
}

}  // namespace init
}  // namespace android
