/**
 * src/include_diagram/visitor/translation_unit_visitor.h
 *
 * Copyright (c) 2021-2022 Bartek Kryza <bkryza@gmail.com>
 *
 * 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 "common/model/enums.h"
#include "common/model/package.h"
#include "config/config.h"
#include "include_diagram/model/diagram.h"
#include "include_diagram/visitor/translation_unit_context.h"

#include <clang-c/CXCompilationDatabase.h>
#include <clang-c/Index.h>
#include <cppast/cpp_preprocessor.hpp>
#include <cppast/visitor.hpp>
#include <type_safe/reference.hpp>

#include <functional>
#include <map>
#include <memory>
#include <string>

namespace clanguml::include_diagram::visitor {

class translation_unit_visitor {
public:
    translation_unit_visitor(cppast::cpp_entity_index &idx,
        clanguml::include_diagram::model::diagram &diagram,
        const clanguml::config::include_diagram &config);

    void operator()(const cppast::cpp_entity &file);

private:
    void process_include_directive(
        const cppast::cpp_include_directive &include_directive);

    void process_source_file(const cppast::cpp_file &file);

    void process_external_system_header(
        const cppast::cpp_include_directive &include_directive);

    void process_internal_header(
        const cppast::cpp_include_directive &include_directive,
        const std::filesystem::path &include_path);

    // ctx allows to track current visitor context, e.g. current namespace
    translation_unit_context ctx;
};
}
