///////////////////////////////////////////////////////////////////////////////
//
//  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
    std::string _handlerType;
    std::string _handlerName;

    // User Data name
    std::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 std::string& handlerType;
    const std::string& handlerName;

    const std::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 std::string& );
    void setUserDataName   ( const std::string& );

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

    bool hasUserDataName() const;
    void removeUserDataName();

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

private:
    void fetch();

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

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

    static std::string toStringTrackType( const std::string& );
};

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

}} // namespace mp4v2::util

#endif // MP4V2_UTIL_TRACKMODIFIER_H
