///////////////////////////////////////////////////////////////////////////////
//
//  The contents of this file are subject to the Mozilla Public License
//  Version 1.1 (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.mozilla.org/MPL/
//
//  Software distributed under the License is distributed on an "AS IS"
//  basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
//  License for the specific language governing rights and limitations
//  under the License.
// 
//  The Original Code is MP4v2.
// 
//  The Initial Developer of the Original Code is Kona Blend.
//  Portions created by Kona Blend are Copyright (C) 2008.
//  All Rights Reserved.
//
//  Contributors:
//      Kona Blend, kona8lend@@gmail.com
//
///////////////////////////////////////////////////////////////////////////////

#ifndef MP4V2_UTIL_TRACKMODIFIER_H
#define MP4V2_UTIL_TRACKMODIFIER_H

namespace mp4v2 { namespace util {

///////////////////////////////////////////////////////////////////////////////

class MP4V2_EXPORT TrackModifier
{
private:
    class Properties
    {
    private:
        TrackModifier& _trackModifier;

    public:
        Properties( TrackModifier& );

        void update();

        MP4Integer24Property&    flags;
        MP4Integer16Property&    layer;
        MP4Integer16Property&    alternateGroup;
        MP4Float32Property&      volume;
        MP4Float32Property&      width;
        MP4Float32Property&      height;
        MP4LanguageCodeProperty& language;
        MP4StringProperty&       handlerType;
        MP4StringProperty&       handlerName;
        MP4BytesProperty*        userDataName;

    private:
        MP4Property& refProperty( const char* );
        MP4Property* findProperty( const char* );
        void updateProperty( const char*, MP4Property** );
    };

    friend class Properties;

private:
    static MP4Atom& refTrackAtom( MP4File&, uint16_t );

private:
    MP4Atom&   _track;
    Properties _props;

    // Track Header
    bool     _enabled;
    bool     _inMovie;
    bool     _inPreview;
    uint16_t _layer;
    uint16_t _alternateGroup;
    float    _volume;
    float    _width;
    float    _height;

    // Media Header
    bmff::LanguageCode _language;

    // Handler Reference
    string _handlerType;
    string _handlerName;

    // User Data name
    string _userDataName;

public:
    MP4File&         file;
    const uint16_t   trackIndex;
    const MP4TrackId trackId;

    const bool&     enabled;
    const bool&     inMovie;
    const bool&     inPreview;
    const uint16_t& layer;
    const uint16_t& alternateGroup;
    const float&    volume;
    const float&    width;
    const float&    height;

    const bmff::LanguageCode& language;

    const string& handlerType;
    const string& handlerName;

    const string& userDataName;

public:
    TrackModifier( MP4FileHandle, uint16_t );
    ~TrackModifier();

    void setEnabled        ( bool );
    void setInMovie        ( bool );
    void setInPreview      ( bool );
    void setLayer          ( uint16_t );
    void setAlternateGroup ( uint16_t );
    void setVolume         ( float );
    void setWidth          ( float );
    void setHeight         ( float );
    void setLanguage       ( bmff::LanguageCode );
    void setHandlerName    ( const string& );
    void setUserDataName   ( const string& );

    // set by string
    void setEnabled        ( const string& );
    void setInMovie        ( const string& );
    void setInPreview      ( const string& );
    void setLayer          ( const string& );
    void setAlternateGroup ( const string& );
    void setVolume         ( const string& );
    void setWidth          ( const string& );
    void setHeight         ( const string& );
    void setLanguage       ( const string& );

    bool hasUserDataName() const;
    void removeUserDataName();

    void dump( std::ostream&, const string& );

private:
    void fetch();

    static string toString( bool );
    static string toString( float, uint8_t, uint8_t );

    static bool&     fromString( const string&, bool& );
    static float&    fromString( const string&, float& );
    static uint16_t& fromString( const string&, uint16_t& );

    static string toStringTrackType( const string& );
};

///////////////////////////////////////////////////////////////////////////////

}} // namespace mp4v2::util

#endif // MP4V2_UTIL_TRACKMODIFIER_H
