//
// Copyright 2016 Pixar
//
// Licensed under the Apache License, Version 2.0 (the "Apache License")
// with the following modification; you may not use this file except in
// compliance with the Apache License and the following modification to it:
// Section 6. Trademarks. is deleted and replaced with:
//
// 6. Trademarks. This License does not grant permission to use the trade
//    names, trademarks, service marks, or product names of the Licensor
//    and its affiliates, except as required to comply with Section 4(c) of
//    the License and to reproduce the content of the NOTICE file.
//
// You may obtain a copy of the Apache License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the Apache License with the above modification is
// distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the Apache License for the specific
// language governing permissions and limitations under the Apache License.
//
/// \file wrapMapperSpec.cpp


#include "pxr/usd/sdf/mapperSpec.h"

#include "pxr/usd/sdf/attributeSpec.h"
#include "pxr/usd/sdf/mapperArgSpec.h"
#include "pxr/usd/sdf/pyChildrenProxy.h"
#include "pxr/usd/sdf/pySpec.h"
#include <boost/python.hpp>

using namespace boost::python;

static SdfPyChildrenProxy<SdfMapperArgSpecView>
WrapGetArgs(const SdfMapperSpec& self)
{
    return SdfPyChildrenProxy<SdfMapperArgSpecView>(self.GetArgs());
}

void wrapMapperSpec()
{    
    typedef SdfMapperSpec This;

    class_<This, SdfHandle<This>,
           bases<SdfSpec>, boost::noncopyable>
        ("MapperSpec", no_init)
        .def(SdfPySpec())
        .def(SdfMakePySpecConstructor(&This::New,
            "__init__(ownerAttributeSpec, connectionTargetPath, typeName)\n"
            "ownerAttributeSpec : AttributeSpec\n"
            "connectionTargetPath : Path\n"
            "typeName : string\n\n"
            "Create a mapper spec for the given ownerAttributeSpec\n"
            "on the given connectionTargetPath with the given mapper "
            "typeName."))

        .add_property("attribute",
            &This::GetAttribute,
            "The attribute that owns this mapper.")

        .add_property("connectionTargetPath",
            &This::GetConnectionTargetPath,
            "The connection path this mapper is attached to.")

        .add_property("typeName",
            &This::GetTypeName,
            &This::SetTypeName,
            "The type name for the mapper.\n\n"
            "When instantiated on a stage, the appropriate subclass of MfMapper\n"
            "will be chosen based on this type name.")

        .add_property("args", 
            &::WrapGetArgs, 
            "The mapper's args.\n\n"
            "The returned object is a proxy through which the args can be accessed\n"
            "or deleted.  It is not allowed to assign new arguments into the\n"
            "list.  New MapperArgSpecs must be directly constructed.")

        .add_property("symmetryArgs", 
            &This::GetSymmetryArgs, 
            &This::SetSymmetryArgs, 
            "The mapper's symmetry args.")
        ;
}
