import * as React from "react";
import { DarkWebItems }                         from "./DarkWebItems";

import { Player }                               from "../Player";
import { SpecialServerIps }                     from "../Server/SpecialServerIps";
import { post, postElement }                    from "../ui/postToTerminal";
import { Money }                                from "../ui/React/Money";

import { isValidIPAddress }                     from "../../utils/helpers/isValidIPAddress";

//Posts a "help" message if connected to DarkWeb
export function checkIfConnectedToDarkweb(): void {
    if (SpecialServerIps.hasOwnProperty("Darkweb Server")) {
        const darkwebIp =  SpecialServerIps.getIp("Darkweb Server");
        if (!isValidIPAddress(darkwebIp)) {return;}
        if (darkwebIp == Player.getCurrentServer().ip) {
            post("You are now connected to the dark web. From the dark web you can purchase illegal items. " +
                 "Use the 'buy -l' command to display a list of all the items you can buy. Use 'buy [item-name] " +
                 "to purchase an item.");
        }
    }
}

//Handler for dark web commands. The terminal's executeCommand() function will pass
//dark web-specific commands into this. It will pass in the raw split command array
//rather than the command string
export function executeDarkwebTerminalCommand(commandArray: string[]): void {
    if (commandArray.length == 0) {return;}
    switch (commandArray[0]) {
        case "buy": {
            if (commandArray.length != 2) {
                post("Incorrect number of arguments. Usage: ");
                post("buy -l");
                post("buy [item name]");
                return;
            }
            const arg = commandArray[1];
            if (arg == "-l" || arg == "-1" || arg == "--list") {
                listAllDarkwebItems();
            } else {
                buyDarkwebItem(arg);
            }
            break;
        }
        default:
            post("Command not found");
            break;
    }
}

function listAllDarkwebItems(): void {
    for(const key in DarkWebItems) {
        const item = DarkWebItems[key];
        postElement(<>{item.program} - {Money(item.price)} - {item.description}</>);
    }
}

function buyDarkwebItem(itemName: string): void {
    itemName = itemName.toLowerCase();

    // find the program that matches, if any
    let item = null;
    for(const key in DarkWebItems) {
        const i = DarkWebItems[key];
        if(i.program.toLowerCase() == itemName) {
            item = i;
        }
    }

    // return if invalid
    if(item === null) {
        post("Unrecognized item: "+itemName);
        return;
    }

    // return if the player already has it.
    if(Player.hasProgram(item.program)) {
        post('You already have the '+item.program+' program');
        return;
    }

    // return if the player doesn't have enough money
    if(Player.money.lt(item.price)) {
        post("Not enough money to purchase " + item.program);
        return;
    }

    // buy and push
    Player.loseMoney(item.price);
    Player.getHomeComputer().programs.push(item.program);
    post('You have purchased the ' + item.program + ' program. The new program can be found on your home computer.');
}
