package net.jrtechs.www.webCrawler;

import net.jrtechs.www.model.Player;
import net.jrtechs.www.utils.FileReader;
import net.jrtechs.www.utils.WrappedFileWriter;
import org.json.JSONArray;
import org.json.JSONObject;

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;


/**
 * File which handles the file IO for storing
 * all the players on the HHD
 *
 * @author Jeffery Russell 11-18-18
 */
public class FileIO
{
    /** Base directory to store all the data */
    private String baseFilePath;

    /**
     * Initalizes the base directory
     * @param basePath
     */
    public FileIO(String basePath)
    {
        this.baseFilePath = basePath;
    }


    /**
     * Helper function to piece together the naming convention
     * for the JSON file.
     *
     * @param id player id
     * @return path of the file being saved
     */
    private String getURL(String id)
    {
        return baseFilePath + id + ".json";
    }


    /**
     * Determines if we already have the player
     * on disk.
     *
     * @param id steam id of the player
     * @return if the file exists on disk
     */
    public boolean playerExists(String id)
    {
        String fileName = baseFilePath + id + ".json";
        return new File(fileName).isFile();
    }


    /**
     * Returns the date in a form which is easy to read and write
     * to from a file.
     *
     * @return
     */
    private String getDate()
    {
        String pattern = "yyyy-MM-dd";
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);

        return simpleDateFormat.format(new Date());
    }


    /**
     * Reads all the friends from a player on the disk
     *
     * ** This should only be called if we know the player
     * is stored on the disk.
     *
     * @param id steam id of the player
     * @return list of all their friends.
     */
    public List<String> readFriends(String id)
    {
        String fileContents = FileReader.readFile(this.getURL(id));

        JSONObject player = new JSONObject(fileContents);

        if(player.has("friends"))
        {
            List<String> list = new ArrayList<>();

            JSONArray jsonArray = player.getJSONArray("friends");

            for(int i = 0 ; i < jsonArray.length();i++)
            {
                list.add(jsonArray.getString(i));
            }
            return list;
        }
        return new ArrayList<>();
    }


    /**
     * Writes the player to the file.
     *
     * @param player
     */
    public void writeToFile(Player player, List<String> friendIDS)
    {
        JSONObject object = new JSONObject();
        object.put("name", player.getName());
        object.put("date", getDate());
        object.put("friends", friendIDS);

        String fileName = baseFilePath + player.getId() + ".json";

        WrappedFileWriter.writeToFile(object.toString(4), fileName);
    }
}
