///////////////////////////////////////////////////////////////////////////////
//
//  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
