/*
 * Copyright (C) 2015 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.
 */

#ifndef AAPT_TEST_BUILDERS_H
#define AAPT_TEST_BUILDERS_H

#include "ResourceTable.h"
#include "ResourceValues.h"
#include "test/Common.h"
#include "util/Util.h"
#include "xml/XmlDom.h"

#include <memory>

namespace aapt {
namespace test {

class ResourceTableBuilder {
private:
    DummyDiagnosticsImpl mDiagnostics;
    std::unique_ptr<ResourceTable> mTable = util::make_unique<ResourceTable>();

public:
    ResourceTableBuilder() = default;

    StringPool* getStringPool() {
        return &mTable->stringPool;
    }

    ResourceTableBuilder& setPackageId(const StringPiece& packageName, uint8_t id) {
        ResourceTablePackage* package = mTable->createPackage(packageName, id);
        assert(package);
        return *this;
    }

    ResourceTableBuilder& addSimple(const StringPiece& name, const ResourceId& id = {}) {
        return addValue(name, id, util::make_unique<Id>());
    }

    ResourceTableBuilder& addSimple(const StringPiece& name, const ConfigDescription& config,
                                    const ResourceId& id = {}) {
        return addValue(name, config, id, util::make_unique<Id>());
    }

    ResourceTableBuilder& addReference(const StringPiece& name, const StringPiece& ref) {
        return addReference(name, {}, ref);
    }

    ResourceTableBuilder& addReference(const StringPiece& name, const ResourceId& id,
                                       const StringPiece& ref) {
        return addValue(name, id, util::make_unique<Reference>(parseNameOrDie(ref)));
    }

    ResourceTableBuilder& addString(const StringPiece& name, const StringPiece& str) {
        return addString(name, {}, str);
    }

    ResourceTableBuilder& addString(const StringPiece& name, const ResourceId& id,
                                    const StringPiece& str) {
        return addValue(name, id, util::make_unique<String>(mTable->stringPool.makeRef(str)));
    }

    ResourceTableBuilder& addString(const StringPiece& name, const ResourceId& id,
                                    const ConfigDescription& config, const StringPiece& str) {
        return addValue(name, config, id,
                        util::make_unique<String>(mTable->stringPool.makeRef(str)));
    }

    ResourceTableBuilder& addFileReference(const StringPiece& name, const StringPiece& path) {
        return addFileReference(name, {}, path);
    }

    ResourceTableBuilder& addFileReference(const StringPiece& name, const ResourceId& id,
                                           const StringPiece& path) {
        return addValue(name, id,
                        util::make_unique<FileReference>(mTable->stringPool.makeRef(path)));
    }

    ResourceTableBuilder& addFileReference(const StringPiece& name, const StringPiece& path,
                                           const ConfigDescription& config) {
        return addValue(name, config, {},
                        util::make_unique<FileReference>(mTable->stringPool.makeRef(path)));
    }

    ResourceTableBuilder& addValue(const StringPiece& name,
                                   std::unique_ptr<Value> value) {
        return addValue(name, {}, std::move(value));
    }

    ResourceTableBuilder& addValue(const StringPiece& name, const ResourceId& id,
                                   std::unique_ptr<Value> value) {
        return addValue(name, {}, id, std::move(value));
    }

    ResourceTableBuilder& addValue(const StringPiece& name, const ConfigDescription& config,
                                   const ResourceId& id, std::unique_ptr<Value> value) {
        ResourceName resName = parseNameOrDie(name);
        bool result = mTable->addResourceAllowMangled(resName, id, config, {},
                                                      std::move(value), &mDiagnostics);
        assert(result);
        return *this;
    }

    ResourceTableBuilder& setSymbolState(const StringPiece& name, const ResourceId& id,
                                         SymbolState state) {
        ResourceName resName = parseNameOrDie(name);
        Symbol symbol;
        symbol.state = state;
        bool result = mTable->setSymbolStateAllowMangled(resName, id, symbol, &mDiagnostics);
        assert(result);
        return *this;
    }

    std::unique_ptr<ResourceTable> build() {
        return std::move(mTable);
    }
};

inline std::unique_ptr<Reference> buildReference(const StringPiece& ref,
                                                 const Maybe<ResourceId>& id = {}) {
    std::unique_ptr<Reference> reference = util::make_unique<Reference>(parseNameOrDie(ref));
    reference->id = id;
    return reference;
}

inline std::unique_ptr<BinaryPrimitive> buildPrimitive(uint8_t type, uint32_t data) {
    android::Res_value value = {};
    value.size = sizeof(value);
    value.dataType = type;
    value.data = data;
    return util::make_unique<BinaryPrimitive>(value);
}

template <typename T>
class ValueBuilder {
private:
    std::unique_ptr<Value> mValue;

public:
    template <typename... Args>
    explicit ValueBuilder(Args&&... args) : mValue(new T{ std::forward<Args>(args)... }) {
    }

    template <typename... Args>
    ValueBuilder& setSource(Args&&... args) {
        mValue->setSource(Source{ std::forward<Args>(args)... });
        return *this;
    }

    ValueBuilder& setComment(const StringPiece& str) {
        mValue->setComment(str);
        return *this;
    }

    std::unique_ptr<Value> build() {
        return std::move(mValue);
    }
};

class AttributeBuilder {
private:
    std::unique_ptr<Attribute> mAttr;

public:
    explicit AttributeBuilder(bool weak = false) : mAttr(util::make_unique<Attribute>(weak)) {
        mAttr->typeMask = android::ResTable_map::TYPE_ANY;
    }

    AttributeBuilder& setTypeMask(uint32_t typeMask) {
        mAttr->typeMask = typeMask;
        return *this;
    }

    AttributeBuilder& addItem(const StringPiece& name, uint32_t value) {
        mAttr->symbols.push_back(Attribute::Symbol{
                Reference(ResourceName({}, ResourceType::kId, name)),
                value});
        return *this;
    }

    std::unique_ptr<Attribute> build() {
        return std::move(mAttr);
    }
};

class StyleBuilder {
private:
    std::unique_ptr<Style> mStyle = util::make_unique<Style>();

public:
    StyleBuilder& setParent(const StringPiece& str) {
        mStyle->parent = Reference(parseNameOrDie(str));
        return *this;
    }

    StyleBuilder& addItem(const StringPiece& str, std::unique_ptr<Item> value) {
        mStyle->entries.push_back(Style::Entry{ Reference(parseNameOrDie(str)), std::move(value) });
        return *this;
    }

    StyleBuilder& addItem(const StringPiece& str, const ResourceId& id, std::unique_ptr<Item> value) {
        addItem(str, std::move(value));
        mStyle->entries.back().key.id = id;
        return *this;
    }

    std::unique_ptr<Style> build() {
        return std::move(mStyle);
    }
};

class StyleableBuilder {
private:
    std::unique_ptr<Styleable> mStyleable = util::make_unique<Styleable>();

public:
    StyleableBuilder& addItem(const StringPiece& str, const Maybe<ResourceId>& id = {}) {
        mStyleable->entries.push_back(Reference(parseNameOrDie(str)));
        mStyleable->entries.back().id = id;
        return *this;
    }

    std::unique_ptr<Styleable> build() {
        return std::move(mStyleable);
    }
};

inline std::unique_ptr<xml::XmlResource> buildXmlDom(const StringPiece& str) {
    std::stringstream in;
    in << "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" << str;
    StdErrDiagnostics diag;
    std::unique_ptr<xml::XmlResource> doc = xml::inflate(&in, &diag, Source("test.xml"));
    assert(doc);
    return doc;
}

inline std::unique_ptr<xml::XmlResource> buildXmlDomForPackageName(IAaptContext* context,
                                                                   const StringPiece& str) {
    std::unique_ptr<xml::XmlResource> doc = buildXmlDom(str);
    doc->file.name.package = context->getCompilationPackage();
    return doc;
}

} // namespace test
} // namespace aapt

#endif /* AAPT_TEST_BUILDERS_H */
