muddy/
muddy/CVS/
muddy/area/
muddy/area/CVS/
muddy/clans/CVS/
muddy/classes/CVS/
muddy/doc/
muddy/doc/CVS/
muddy/etc/CVS/
muddy/etc/i3/
muddy/etc/i3/CVS/
muddy/imc/CVS/
muddy/lang/CVS/
muddy/licenses/CVS/
muddy/msgdb/CVS/
muddy/new/CVS/
muddy/notes/
muddy/player/
muddy/races/CVS/
muddy/religions/CVS/
muddy/src/CVS/
muddy/src/comm/CVS/
muddy/src/db/CVS/
muddy/src/intermud/
muddy/src/intermud/CVS/
muddy/src/irc/CVS/
muddy/src/olc/CVS/
/* $Id: olc_price.c,v 1.666 2004/09/20 10:50:30 shrike Exp $ */

/************************************************************************************
 *    Copyright 2004 Astrum Metaphora consortium                                    *
 *                                                                                  *
 *    Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0                                    *
 *                                                                                  *
 *    Unless required by applicable law or agreed to in writing, software           *
 *    distributed under the License is distributed on an "AS IS" BASIS,             *
 *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.      *
 *    See the License for the specific language governing permissions and           *
 *    limitations under the License.                                                *
 *                                                                                  *
 ************************************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "merc.h"
#include "olc.h"
#include "price.h"

#define EDIT_PRICE(ch, price)	(price = (price_t*) ch->desc->pEdit)

DECLARE_OLC_FUN(priceed_create       );
DECLARE_OLC_FUN(priceed_edit         );
DECLARE_OLC_FUN(priceed_touch        );
DECLARE_OLC_FUN(priceed_show         );
DECLARE_OLC_FUN(priceed_list         );
DECLARE_OLC_FUN(priceed_name         );
DECLARE_OLC_FUN(priceed_descriptor   );
DECLARE_OLC_FUN(priceed_amount       );
DECLARE_OLC_FUN(priceed_amount_type  );

static DECLARE_VALIDATE_FUN(validate_name);

olc_cmd_t olc_cmds_price[] =
{
    { "create",        priceed_create,         5                },
    { "edit",          priceed_edit,           5                },
    { "touch",         olced_dummy,            5                },
    { "show",          priceed_show,           0                },
    { "list",          priceed_list,           0                },

    { "name",          priceed_name,           0, validate_name },
    { "descriptor",    priceed_descriptor,     0                },
    { "amount",        priceed_amount,         0                },
	{ "type",          priceed_amount_type,    0, price_type    },

    { "commands",      show_commands,          0},
    { NULL}
};


OLC_FUN(priceed_create)
{
    price_t *price;
    char arg[MAX_STRING_LENGTH];

    if (ch->pcdata->security < SECURITY_PRICES)
    {
        char_puts("PriceEd: Insufficient security for editing religions\n", ch);
        return FALSE;
    }

    first_arg(argument, arg, sizeof(arg), FALSE);

    if (arg[0] == '\0')
    {
        do_help(ch, "'OLC CREATE'");
        return FALSE;
    }

	price = price_lookup(arg, str_cmp);

    if (price != NULL)
    {
        char_printf(ch, "PriceEd: %s: already exists.\n", price->name);
        return FALSE;
    }

    price                = price_new();
    price->name          = str_dup(arg);
	price->descriptor    = str_empty;


    ch->desc->pEdit     = (void *)price;
    OLCED(ch)   = olced_lookup(ED_PRICE);  //need added to olc.h                            
    //touch_price(price);
    char_puts("PriceEd: price created.\n",ch);
    return FALSE;
}

OLC_FUN(priceed_edit)
{
    price_t *price;
    char arg[MAX_STRING_LENGTH];

    if (ch->pcdata->security < SECURITY_PRICES)
    {
        char_puts("PriceEd: Insufficient security.\n", ch);
        return FALSE;
    }

    one_argument(argument, arg, sizeof(arg));
    if (arg[0] == '\0')
    {
        do_help(ch, "'OLC EDIT'");
        return FALSE;
    }

    if (is_number(arg))
    {
        if (atoi(arg) < 0 || atoi(arg) > prices.nused)
        {
            char_puts("PriceEd: not such price.\n", ch);
            return FALSE;
        }
        else
            price = VARR_GET(&prices, atoi(arg));
    }
    else
        if ((price = price_lookup(arg, str_cmp)) == NULL)
    {
        char_printf(ch, "PriceEd: %s: No such price.\n", arg);
        return FALSE;
    }

    ch->desc->pEdit = price;
    OLCED(ch)   = olced_lookup(ED_PRICE);
    return FALSE;
}

OLC_FUN(priceed_show)
{
    char arg[MAX_STRING_LENGTH];
    BUFFER *output;
    price_t *price;

    one_argument(argument, arg, sizeof(arg));

    if (arg[0] == '\0')
    {
        if (IS_EDIT(ch, ED_PRICE))
            EDIT_PRICE(ch, price);
        else
        {
            do_help(ch, "'OLC ASHOW'");
            return FALSE;
        }
    }
    else
    {
        if (is_number(arg))
        {
            if (atoi(arg) < 0 || atoi(arg) > prices.nused)
            {
                char_puts("PriceEd: not such price.\n", ch);
                return FALSE;
            }
            else
                price = VARR_GET(&prices, atoi(arg));
        }
        else
            if ((price = price_lookup(arg, str_cmp)) == NULL)
        {
            char_printf(ch, "PriceEd: %s: No such price.\n", arg);
            return FALSE;
        }

    }

    output = buf_new(-1);

    buf_printf(output, "Name:          [%s]\n", price->name);
    buf_printf(output, "Description:   [%s]\n", price->descriptor);
    buf_printf(output, "Amount:        [%-6d %s]\n", price->amount, flag_string(price_type, price->amount_type));
	
    page_to_char(buf_string(output), ch);
    buf_free(output);

    return FALSE;
}

OLC_FUN(priceed_list)
{
    int i;
    BUFFER *output;

    output = buf_new(-1);

    for (i = 0; i < prices.nused; i++)
	{
        price_t *price = (price_t*) VARR_GET(&prices, i);
        buf_printf(output, "[%3d] %-15s %-30s [%5d] %d\n", i, price->name, price->descriptor, price->amount, price->amount_type);
	}

    page_to_char(buf_string(output), ch);
    buf_free(output);
    return FALSE;
}


OLC_FUN(priceed_name)
{
    price_t *price;
    
    EDIT_PRICE(ch, price);
    return olced_str(ch, argument, cmd, &price->name);
}

OLC_FUN(priceed_descriptor)
{
    price_t *price;

    EDIT_PRICE(ch, price);
    return olced_str(ch, argument, cmd, &price->descriptor);
}


OLC_FUN(priceed_amount)
{
    price_t *price;
    char arg[MAX_STRING_LENGTH];

    one_argument(argument, arg, sizeof(arg));

    EDIT_PRICE(ch, price);
    return olced_number(ch, argument, cmd, &price->amount);
}

static VALIDATE_FUN(validate_name)
{
    price_t *price;
    EDIT_PRICE(ch, price);

	price = price_lookup(arg, str_cmp);

	if (price != NULL)
    {
        char_printf(ch, "PriceEd: %s: already exists.\n", price->name);
        return FALSE;
    }

    return TRUE;
}

OLC_FUN(priceed_amount_type)
{
    price_t *price;
    EDIT_PRICE(ch, price);
    return olced_flag64(ch, argument, cmd, &price->amount_type);
}