// Copyright (c) rAthena Dev Teams - Licensed under GNU GPL
// For more information, see LICENCE in the main folder

#ifndef CASHSHOP_HPP
#define CASHSHOP_HPP

#include "../config/core.hpp"

#include "../common/cbasetypes.hpp" // uint16, uint32
#include "../common/mmo.hpp" // t_itemid
#include "../common/timer.hpp" // ShowWarning, ShowStatus

struct map_session_data;

void do_init_cashshop( void );
void do_final_cashshop( void );
void cashshop_reloaddb( void );
bool cashshop_buylist( struct map_session_data* sd, uint32 kafrapoints, int n, struct PACKET_CZ_SE_PC_BUY_CASHITEM_LIST_sub* item_list );

// Taken from AEGIS
enum CASH_SHOP_TAB_CODE
{
	CASHSHOP_TAB_NEW =  0x0,
	CASHSHOP_TAB_POPULAR,
	CASHSHOP_TAB_LIMITED,
	CASHSHOP_TAB_RENTAL,
	CASHSHOP_TAB_PERPETUITY,
	CASHSHOP_TAB_BUFF,
	CASHSHOP_TAB_RECOVERY,
	CASHSHOP_TAB_ETC,
#if PACKETVER_SUPPORTS_SALES
	CASHSHOP_TAB_SALE,
#endif
	CASHSHOP_TAB_MAX
};

// PACKET_ZC_SE_PC_BUY_CASHITEM_RESULT
enum CASHSHOP_BUY_RESULT
{
	CASHSHOP_RESULT_SUCCESS =  0x0,
	CASHSHOP_RESULT_ERROR_SYSTEM =  0x1,
	CASHSHOP_RESULT_ERROR_SHORTTAGE_CASH =  0x2,
	CASHSHOP_RESULT_ERROR_UNKONWN_ITEM =  0x3,
	CASHSHOP_RESULT_ERROR_INVENTORY_WEIGHT =  0x4,
	CASHSHOP_RESULT_ERROR_INVENTORY_ITEMCNT =  0x5,
	CASHSHOP_RESULT_ERROR_PC_STATE =  0x6,
	CASHSHOP_RESULT_ERROR_OVER_PRODUCT_TOTAL_CNT =  0x7,
	CASHSHOP_RESULT_ERROR_SOME_BUY_FAILURE =  0x8,
	CASHSHOP_RESULT_ERROR_RUNE_OVERCOUNT =  0x9,
	CASHSHOP_RESULT_ERROR_EACHITEM_OVERCOUNT =  0xa,
	CASHSHOP_RESULT_ERROR_UNKNOWN =  0xb,
	CASHSHOP_RESULT_ERROR_BUSY =  0xc,
};

struct cash_item_data{
	t_itemid nameid;
	uint32 price;
};

struct cash_item_db{
	struct cash_item_data** item;
	uint32 count;
};

extern struct cash_item_db cash_shop_items[CASHSHOP_TAB_MAX];
extern bool cash_shop_defined;

enum e_sale_add_result {
	SALE_ADD_SUCCESS = 0,
	SALE_ADD_FAILED = 1,
	SALE_ADD_DUPLICATE = 2
};

struct sale_item_data{
	// Data
	t_itemid nameid;
	time_t start;
	time_t end;
	uint32 amount;

	// Timers
	int timer_start;
	int timer_end;
};

struct sale_item_db{
	struct sale_item_data** item;
	uint32 count;
};

#if PACKETVER_SUPPORTS_SALES
extern struct sale_item_db sale_items;

struct sale_item_data* sale_find_item(t_itemid nameid, bool onsale);
enum e_sale_add_result sale_add_item(t_itemid nameid, int32 count, time_t from, time_t to);
bool sale_remove_item(t_itemid nameid);
void sale_notify_login( struct map_session_data* sd );
#endif

#endif /* CASHSHOP_HPP */
