#-******************************************************************************
#
# Copyright (c) 2012,
#  Sony Pictures Imageworks Inc. and
#  Industrial Light & Magic, a division of Lucasfilm Entertainment Company Ltd.
#
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
# *       Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# *       Redistributions in binary form must reproduce the above
# copyright notice, this list of conditions and the following disclaimer
# in the documentation and/or other materials provided with the
# distribution.
# *       Neither the name of Sony Pictures Imageworks, nor
# Industrial Light & Magic, nor the names of their contributors may be used
# to endorse or promote products derived from this software without specific
# prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#
#-******************************************************************************

import sys
from alembic.AbcCoreAbstract import *
from alembic.Abc import *
from alembic.Util import *

def visitSmallArraySamples( iProp, iIndent ):
    indent = " " * iIndent

    for i, s in enumerate( iProp.arraySamples ):
        print "%ssample %d:" % ( indent, i )
        if s is None:
            print indent, "********** Got nothing **********"
        else:
            print indent,
            for j in s:
                print j,
            print

def visitScalarSamples( iProp, iIndent ):
    indent = " " * iIndent

    for i, s in enumerate( iProp.scalarSamples ):
        print "%ssample %d:" % ( indent, i )
        if s is None:
            print indent, "********** Got nothing **********"
        else:
            print "%s%s" % ( indent, s )

def visitArraySamples( iProp, iIndent ):
    indent = " " * iIndent

    for i, s in enumerate( iProp.samples ):
        print "%ssample %d:" % ( indent, i )
        if s is None:
            print indent, "********** Got nothing **********"
        else:
            print indent,
            for j in s:
                print j,
            print 

def visitCompoundProperty( iProp, iIndent ):
    indent = " " * iIndent
    ptype = "CompoundProperty"
    name = "name=%s" % iProp.getName()
    interp = "schema=%s" % iProp.getMetaData().get( "schema" )

    print "%s%s %s; %s" % ( indent, ptype, name, interp )

    visitProperties( iProp, iIndent+2 )

def visitSimpleProperty( iProp, iIndent ):
    indent = " " * iIndent
    ptype = "ScalarProperty" if iProp.isScalar() else "ArrayProperty"
    name = "name=%s" % iProp.getName()
    md = "interpretation=%s" % iProp.getMetaData().get( "interpretation" )
    dtype = "datatype=%s" % iProp.getDataType()
    numsamps = "numsamps=%s" %iProp.getNumSamples()

    print "%s%s %s; %s; %s; %s" % ( indent, ptype, name, md, dtype, numsamps )

    if iProp.isScalar():
        if iProp.getDataType().getExtent() == 1:
            visitScalarSamples( iProp, iIndent+2 )
        elif len( iProp.getMetaData().get( "interpretation" ) ) > 0:
            visitScalarSamples( iProp, iIndent+2 )
        else:
            visitSmallArraySamples( iProp, iIndent+2 )
    else:
        visitArraySamples( iProp, iIndent+2 )


def visitProperties( iParent, iIndent ):
    for header in iParent.propertyheaders:
        prop = iParent.getProperty( header.getName() )

        if header.isCompound():
            visitCompoundProperty( prop, iIndent+2 )
        elif header.isScalar() or header.isArray():
            visitSimpleProperty( prop, iIndent+2 )

def visitObject( iObj, iIndent = 0 ):

    path = iObj;
    indent = " " * iIndent
    ptype = "Object"
    name = "name=%s" % path

    if path != "/":
        iIndent += 2
        print "%s%s %s" % ( indent, ptype, name )

    visitProperties( iObj.getProperties(), iIndent )

    for child in iObj.children:
        visitObject( child, iIndent )

def visitArchive( iArg ):
    iArchive = IArchive( iArg )

    print "AbcEcho for %s" % GetLibraryVersion()

    info = GetArchiveInfo ( iArchive )

    if len( info['appName'] ) > 0:
        print "  file written by : %s" % info['appName']
        print "  using Alembic : %s" % info['libraryVersionString']
        print "  written on : %s" % info['whenWritten']
        print "  user description by: %s" % info['userDescription']
        print
    else:
        print iArg
        print "  (file doesn't have any ArchiveInfo)"
        print

    visitObject( iArchive.getTop() )


map( visitArchive, [ a for a in sys.argv[1:] ] )
