/*
Copyright (C) 2005 David Green <green@couchpotato.net>
All Rights Reserved.

This file is part of Aelfengard.

Aelfengard is proprietary software. You may not redistribute it without
prior written permission from the copyright holder.
*/

package server;

import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;

public class Item extends RoomEntity {

    private static final long serialVersionUID = 12349817419237461L;
    
    private String name;
    private String description = "";
    private String image;

    private boolean destroyed;
    
    public Item() {
        // for deserialization
    }
    
    public Item(Player player, String name, Container container) {
        super(IdType.ITEM);
        this.name = name;
        IdType.addItem(this);
        moveTo(container);
    }
    
    public void setName(String name) {
        this.name = name;
        getRoom().notifyRoomEntityChanged(this, null);
    }

    public Container getContainer() {
        return ParentTracker.ITEM.getParent(this);
    }
    
    @Override
    public Room getRoom() {
        Container container = getContainer();
        if (container == null) {
            return null;
        }
        ContainerHolder holder = container.getHolder();
        if (holder instanceof Room) {
            return (Room) holder;
        }
        return null;
    }
    
    

    @Override
    public boolean isVisibleTo(Player player) {
        return true;
    }
    
    @Override
    public boolean isAudibleTo(Player player) {
        return true;
    }

    public void destroy() {
        this.destroyed = true;
        moveTo((Container) null);
        IdType.removeItem(this);
    }

    public String getName() {
        return name;
    }

    @Override
    public String getDescription(Player observer) {
        return description;
    }
    
    public void setDescription(String description) {
        this.description = description;
    }
    
    @Override
    public String getImage() {
        return image;
    }
    
    public void setImage(String image) {
        this.image = image;
    }

    @Override
    public void sendInfo(Player player) {
        player.sendText(true, "@000@10F         Type: @000Item");
        player.sendText(false, "@000@10F           Id: @000" + getId());
        player.sendText(false, "@000@10F         Name: @000" + getName(player, false));
        if (player.getAdminFlags().contains(AdminFlag.ADMIN_VIEWS)) {
            Room room = getRoom();
            player.sendText(false, "@000@10F         Room: @000" + String.valueOf(room));
        }
    }

    @Override
    public void writeExternal(ObjectOutput out) throws IOException {
        if (destroyed) {
            throw new FatalError("Attempt to save destroyed item: " + this);
        }
        
        super.writeExternal(out);

        out.writeInt(1); // protocol version
        out.writeObject(name);
        out.writeObject(description);
        out.writeObject(image);
    }

    @Override
    public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
        super.readExternal(in);
        in.readInt(); // protocol version
        name = (String) in.readObject();
        description = (String) in.readObject();
        image = (String) in.readObject();
        IdType.addItem(this);
    }

    @Override
    public String getPossessive(Player observer, boolean somebodyIfUnknown) {
        return getNominative(observer, somebodyIfUnknown) + "'s";
    }
    
    @Override
    public void moveTo(Room room) {
        moveTo(room.getInventory());
    }
    
    public void moveTo(Container container) {
        // tell old room
        Container oldContainer = getContainer();
        if (oldContainer != null) {
            ContainerHolder oldHolder = oldContainer.getHolder();
            if (oldHolder instanceof Room) {
                ((Room) oldHolder).notifyRoomEntityRemoved(this);
            }
        }

        ParentTracker.ITEM.setParent(this, container);
        
        // tell new room
        if (container != null) {
            ContainerHolder holder = container.getHolder();
            if (holder instanceof Room) {
                ((Room) holder).notifyRoomEntityAdded(this);
            }
        }
    }
    
    @Override
    public String toString() {
        return getName() + " #" + getId();
    }

    @Override
    public String getName(Player observer, boolean showStatus) {
        return getName() + " #" + getId();
    }

    @Override
    public String getPlural() {
        return null;
    }

    @Override
    public String getPossessed() {
        return null;
    }

}