//  Copyright © 2003, RESON Inc. All Rights Reserved.
//
//  No part of this file may be reproduced or transmitted in any form or by
//  any means, electronic or mechanical, including photocopy, recording, or
//  information storage or retrieval system, without permission in writing
//  from RESON Inc.
//
//  Filename:   TriggerTableManager.cpp
//
//  Project:    6046
//
//  Author(s):  W. Arcus
//
//  Purpose:    
//
//  Notes:      
//

#include "StdAfx.h"
#include "TriggerTableManager.h"

#include <algorithm>

using std::find;

//////////////////////////////////////////////////////////////////////
// CTriggerTableManager class implementation.

CTriggerTableManager::CTriggerTableManager( void )
{
    m_Ports.clear();
    m_Triggers.clear();
    m_Sequences.clear();
}

CTriggerTableManager::~CTriggerTableManager( void )
{
    m_Ports.clear();
    m_Triggers.clear();
    m_Sequences.clear();
}

bool CTriggerTableManager::Clear( void )
{
    bool bSuccess = false;

    try
    {
        m_Ports.clear();
        m_Triggers.clear();
        m_Sequences.clear();

        bSuccess = true;
    }
    catch ( ... )
    {
        bSuccess = false;
        TRACE( _T( "CTriggerTableManager::Clear(), Unspecified exception caught\n" ) );
    }

    return bSuccess;
}


bool CTriggerTableManager::AddPort( C7kPort &rPort )
{
    bool bSuccess = false;          // Assume failure for now.

    try
    {
        if ( ! DoesPortExist( rPort.Id() ) )
        {
            rPort.PortNumber( NextPortIndexNumber() );

            m_Ports.push_back( rPort );

            m_Ports.sort();

            bSuccess = true;
        }
    }
    catch ( ... )
    {
        bSuccess = false;
    }

    return bSuccess;
}

bool CTriggerTableManager::RemovePort( const unsigned long &rulPortIndex )
{
    bool bSuccess = false;

    try
    {
        PortListIterator_t pPort = find( m_Ports.begin(), m_Ports.end(), rulPortIndex );

        if ( pPort != m_Ports.end() )
        {
            RemoveLinkages( pPort );

            m_Ports.erase( pPort );

            SortAll();
        }

        bSuccess = true;
    }
    catch ( ... )
    {
        bSuccess = false;
    }

    return false;
}

C7kPort * CTriggerTableManager::Port( const unsigned long &rulPortIndex )
{
    C7kPort *pPort = NULL;

    try
    {
        if ( ! m_Ports.empty() )
        {
            PortListIterator_t pPortIterator = find( m_Ports.begin(), m_Ports.end(), rulPortIndex );

            if ( pPortIterator != m_Ports.end() )
            {
                pPort = &(*pPortIterator);
            }
        }
    }
    catch ( ... )
    {
        pPort = NULL;
    }

    return pPort;
}

bool CTriggerTableManager::AddTrigger( C7kTrigger &rTrigger )
{
    return true;
}

bool CTriggerTableManager::RemoveTrigger( const unsigned long &rulTrigger )
{
    return true;
}

C7kTrigger * CTriggerTableManager::Trigger( const unsigned long &rulTrigger )
{
    return NULL;
}

bool CTriggerTableManager::AddSequence( C7kTriggerSequence &rSequence )
{
    return true;
}

bool CTriggerTableManager::RemoveSequence( const unsigned long &rulSequence )
{
    return true;
}
///////////////////////////////////////////////////////////////////////////////
//

inline
bool CTriggerTableManager::DoesPortExist( const unsigned long &rulPortId ) const
{
    if ( ! m_Ports.empty() )
    {
        return ( find( m_Ports.begin(), m_Ports.end(), rulPortId ) != m_Ports.end() );
    }

    return false;
}

inline
bool CTriggerTableManager::SortAll( void )
{
    bool bSuccess = false;      // Assume failure for now.

    try
    {
        if ( ! m_Ports.empty() )
        {
            m_Ports.sort();
        }

        if ( ! m_Triggers.empty() )
        {
            m_Triggers.sort();
        }

        if ( ! m_Sequences.empty() )
        {
            m_Sequences.sort();
        }

        bSuccess = true;
    }
    catch ( ... )
    {
        bSuccess = false;
    }

    return bSuccess;
}

///////////////////////////////////////////////////////////////////////////////
#pragma CompileMessage_m( "!!! UNDERCONSTRUCTION BELOW HERE !!!" )

inline
unsigned long CTriggerTableManager::NextPortIndexNumber( void )
{
    // Scan the port indicies in the port list then determine and return the next 
    // available unique index.

    return 0UL;
}

inline
bool CTriggerTableManager::RemoveLinkages( PortListIterator_t &rpPort )
{
    // Remove triggers and sequences that map to the nominated port.


    return true;
}

