/**
 * Copyright (c) 2010-2018 by the respective copyright holders.
 *
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 */
package org.openhab.binding.heos.internal.resources;

import java.util.HashMap;

/**
 * The {@link HeosPlayer} represents a player within the HEOS
 * network
 *
 * @author Johannes Einig - Initial contribution
 */

public class HeosPlayer extends HeosMediaObject {

    private final String[] supportedPlayerInfo = { "name", "pid", "gip", "ip", "model", "version", "lineout, network" };
    private final String[] supportedPlayerStates = { "state", "level", "mute", "duration", "cur_pos" };

    private HashMap<String, String> playerInfo;
    private HashMap<String, String> playerState;

    // Player Infos Variables
    private String pid;
    private String name;
    private String model;
    private String ip;
    private String version;
    private String network;
    private String lineout;
    private String gid;
    private boolean online;

    // Player State Variables
    private String state;
    private String level;
    private String mute;
    private String duration;
    private String cur_pos;
    private String shuffle;
    private String repeatMode;

    public HeosPlayer() {
        super();
        initPlayer();
    }

    public void updatePlayerInfo(HashMap<String, String> values) {
        playerInfo = values;
        for (String key : values.keySet()) {
            if (key.equals("name")) {
                name = values.get(key);
            }
            if (key.equals("pid")) {
                pid = values.get(key);
            }
            if (key.equals("ip")) {
                ip = values.get(key);
            }
            if (key.equals("model")) {
                model = values.get(key);
            }
            if (key.equals("version")) {
                version = values.get(key);
            }
            if (key.equals("lineout")) {
                lineout = values.get(key);
            }
            if (key.equals("network")) {
                network = values.get(key);
            }
            if (key.equals("gid")) {
                gid = values.get(key);
            }
        }
    }

    public void updatePlayerState(HashMap<String, String> values) {
        playerState = values;
        for (String key : values.keySet()) {
            if (key.equals("state")) {
                state = values.get(key);
            }
            if (key.equals("level")) {
                level = values.get(key);
            }
            if (key.equals("mute")) {
                mute = values.get(key);
            }
            if (key.equals("duration")) {
                duration = values.get(key);
            }
            if (key.equals("cur_pos")) {
                cur_pos = values.get(key);
            }
        }
    }

    private void initPlayer() {
        playerInfo = new HashMap<>(8);
        playerState = new HashMap<>(5);

        for (String key : supportedPlayerInfo) {
            playerInfo.put(key, null);
        }
        for (String key : supportedPlayerStates) {
            playerState.put(key, null);
        }
        updatePlayerInfo(playerInfo);
        updatePlayerState(playerState);
    }

    public HashMap<String, String> getPlayerInfo() {
        return playerInfo;
    }

    public String getPid() {
        return pid;
    }

    public void setPid(String pid) {
        this.pid = pid;
        playerInfo.put("pid", pid);
    }

    public String getGid() {
        return gid;
    }

    public void setGid(String gid) {
        this.gid = gid;
        playerInfo.put("gid", gid);
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
        playerInfo.put("name", name);
    }

    public String getModel() {
        return model;
    }

    public void setModel(String model) {
        this.model = model;
        playerInfo.put("model", model);
    }

    public String getIp() {
        return ip;
    }

    public void setIp(String ip) {
        this.ip = ip;
        playerInfo.put("ip", ip);
    }

    public String getVersion() {
        return version;
    }

    public void setVersion(String version) {
        this.version = version;
        playerInfo.put("version", version);
    }

    public String getNetwork() {
        return network;
    }

    public void setNetwork(String network) {
        this.network = network;
        playerInfo.put("network", network);
    }

    public String getLineout() {
        return lineout;
    }

    public void setLineout(String lineout) {
        this.lineout = lineout;
        playerInfo.put("lineout", lineout);
    }

    public String[] getSupportedPlayerInfo() {
        return supportedPlayerInfo;
    }

    // Player States

    public String getState() {
        return state;
    }

    public void setState(String state) {
        this.state = state;
        playerState.put("state", state);
    }

    public String getLevel() {
        return level;
    }

    public void setLevel(String level) {
        this.level = level;
        playerState.put("level", level);
    }

    public String getMute() {
        return mute;
    }

    public void setMute(String mute) {
        this.mute = mute;
        playerState.put("mute", mute);
    }

    public String getDuration() {
        return duration;
    }

    public void setDuration(String duration) {
        this.duration = duration;
        playerState.put("duration", duration);
    }

    public String getCurPos() {
        return cur_pos;
    }

    public void setCurPos(String cur_pos) {
        this.cur_pos = cur_pos;
        playerState.put("cur_pos", cur_pos);
    }

    public String[] getSupportedPlayerStates() {
        return supportedPlayerStates;
    }

    public HashMap<String, String> getPlayerState() {
        return playerState;
    }

    public boolean isOnline() {
        return online;
    }

    public void setOnline(boolean online) {
        this.online = online;
    }

    public String getShuffle() {
        return shuffle;
    }

    public void setShuffle(String shuffle) {
        this.shuffle = shuffle;
    }

    public String getRepeatMode() {
        return repeatMode;
    }

    public void setRepeatMode(String repeatMode) {
        this.repeatMode = repeatMode;
    }
}