/** \file
 *
 *  Contains the Service class implementation.
 *
 *  Copyright (c) 2007,2008,2009 MBARI
 *  MBARI Proprietary Information.  All Rights Reserved
 *
 */

#include "Service.h"

const char* const Service::SERVICE_TYPE_STRS[SERVICE_COUNT] =
{
    "Direct",
    "Courier",
    "Express",
    "Priority",
    "Normal",
    "Bulk",
};

const size_t Service::SERVICE_TYPE_STRLEN[SERVICE_COUNT] =
{
    6,
    7,
    7,
    8,
    6,
    4,
};

Service::ServiceType Service::Str2ServiceType( const char* const serviceStr, int len )
{
    if( NULL == serviceStr )
    {
        return SERVICE_UNSPECIFIED;
    }
    if( len < 0 )
    {
        len = strlen( serviceStr );
    }
    for( int i = SERVICE_UNSPECIFIED + 1; i < SERVICE_COUNT; ++i )
    {
        int minLen = AuvMath::Min( SERVICE_TYPE_STRLEN[i], ( size_t )len );
        if( strncasecmp( serviceStr, SERVICE_TYPE_STRS[i], minLen ) == 0 )
        {
            return ( ServiceType )i;
        }
        else if( strncasecmp( serviceStr, "log", AuvMath::Min( 3, minLen ) ) == 0 )
        {
            if( minLen > 3 )
            {
                int minLen = AuvMath::Min( SERVICE_TYPE_STRLEN[i], ( size_t )len - 3 );
                if( strncasecmp( serviceStr + 3, SERVICE_TYPE_STRS[i], minLen ) == 0 )
                {
                    return ( ServiceType )i;
                }
            }
            else
            {
                return SERVICE_MULTI;
            }
        }
    }
    return SERVICE_UNSPECIFIED;
}

const char* Service::ServiceType2Str( Service::ServiceType service )
{
    if( service >= 0 && service < SERVICE_COUNT )
    {
        return SERVICE_TYPE_STRS[ service];
    }
    return "none.";
}

size_t Service::ServiceType2Strlen( Service::ServiceType service )
{
    if( service >= 0 && service < SERVICE_COUNT )
    {
        return SERVICE_TYPE_STRLEN[ service];
    }
    return 0;
}

