#include <iostream>
#include <string>
#include <vector>
#include <unordered_map>
#include <utility>
#include <stdlib.h> 
using namespace std;

class Item
{
    private:
        string m_name;
        float m_cost;
    public:
        Item(string t_name,float t_cost):m_name(t_name),m_cost(t_cost)
        {
            
        }
        string getName()
        {
            return m_name;
        }
        float getCost()
        {
            return m_cost;
        }
};
class VendingMachine
{
    private:
        vector<Item> m_totalItems;
        unordered_map<string,Item>m_products;
        float m_remainingCharges{0};
        float m_moneyInserted{0};
        size_t itemCount{0};
    public:
        VendingMachine()
        {
            
        }
        void addItemToVendingMachine(string t_name,size_t t_cost)
        {
            float temp=static_cast<float>(t_cost)/static_cast<float>(100);  
            Item item(t_name,temp);
            m_totalItems.push_back(item);
            m_products.insert(make_pair(t_name,item));
        }
        bool chooseProduct(string t_name)
        {
            for(auto item:m_totalItems)
            {
                if(item.getName()==t_name)
                {
                    m_remainingCharges=item.getCost();
                    return true;
                }
                itemCount++;
            }
            cout<<"Item not currently available: "+t_name<<endl;
            return false;
        }
        void insertCoin(size_t t_coin)
        {   
            float temp=static_cast<float>(t_coin);
            if(t_coin<=50)
            {
                temp/=100;
                cout.precision(10);
                cout<<scientific<<"temp:"<<temp<<" vs.double "<<0.1<<" or float "<<0.1f<<endl;
            }
            if(temp==0.01f or temp==0.05f or temp==0.1f or temp==1.00f or temp==2.00f or temp==0.25f or temp==0.50f)
            {
                m_moneyInserted+=temp;
                m_remainingCharges-=m_moneyInserted;
            }
            else
            {
                cout<<"Does not accept: "<< t_coin<<" ,please insert correct coin."<<endl;
                return;
            }
        }
        pair<Item,float> getProduct()
        {
            auto item=m_totalItems[itemCount];
            auto itemBack=m_totalItems.back();
            m_totalItems[itemCount]=itemBack;
            m_totalItems.pop_back();
            return make_pair(item,abs(m_remainingCharges));
        }
        
        float refund()
        {
            if(m_remainingCharges<0)
                return abs(m_remainingCharges);
            else
                return 0;
        }
        void resetOperator()
        {
             m_remainingCharges=0;
             m_moneyInserted=0;
             itemCount=0;
        }
};
int main()
{
    Item item("Candy",0.50);
    cout<<item.getName()<<" ";
    cout<<item.getCost()<<endl;
    VendingMachine machine;
    machine.addItemToVendingMachine("CANDY",10);
    machine.addItemToVendingMachine("SNACK",50);
    machine.addItemToVendingMachine("Coke",25);
    machine.insertCoin(10);
    machine.insertCoin(25);
    machine.insertCoin(50);
    machine.chooseProduct("CANDY");
    auto temp=machine.getProduct();
    cout<<temp.first.getName()<<endl;
    cout<<temp.second<<endl;
    machine.resetOperator();
    return 0;  
};
