#ifndef CMVIS_TARGET_H
#define CMVIS_TARGET_H

#include <string>
#include <vector>


class Target {
public:
    Target(const Target&) =default;
    Target(Target&&) noexcept =default;
    Target& operator=(const Target&) =default;
    Target& operator=(Target&&) noexcept =default;
    ~Target() =default;

    [[nodiscard]] const std::string& id() const noexcept;
    [[nodiscard]] const std::string& name() const noexcept;
    [[nodiscard]] const std::string& type() const noexcept;
    [[nodiscard]] bool isGeneratorProvided() const noexcept;
    [[nodiscard]] bool isImported() const noexcept;
    [[nodiscard]] const std::vector<std::string>& dependencies() const noexcept;
    [[nodiscard]] const std::vector<std::string>& sources() const noexcept;
    [[nodiscard]] const std::vector<std::string>& includes() const noexcept;
    [[nodiscard]] const std::vector<std::string>& defines() const noexcept;
    [[nodiscard]] const std::vector<std::string>& compileFlags() const noexcept;
    [[nodiscard]] const std::vector<std::string>& linkLibraries() const noexcept;
    [[nodiscard]] bool hasArtifacts() const noexcept;

private:

    friend class TargetFactory;

    struct BuildData {
        std::string id;
        std::string name;
        std::string type;
        bool isGeneratorProvided{false};
        bool isImported{false};
        std::vector<std::string> dependencies;
        std::vector<std::string> sources;
        std::vector<std::string> includes;
        std::vector<std::string> defines;
        std::vector<std::string> compileFlags;
        std::vector<std::string> linkLibraries;
        bool hasArtifacts{false};
    };

    explicit Target(BuildData&& data);

    std::string id_;
    std::string name_;
    std::string type_;
    bool isGeneratorProvided_;
    bool isImported_;
    std::vector<std::string> dependencies_;
    std::vector<std::string> sources_;
    std::vector<std::string> includes_;
    std::vector<std::string> defines_;
    std::vector<std::string> compileFlags_;
    std::vector<std::string> linkLibraries_;
    bool hasArtifacts_;
};

#endif
