/*
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.command;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

import server.PersistenceManager;
import server.Player;
import server.SyntaxException;

public class BackupCommand extends Command {

    private static final int ONE_HOUR = 1000 * 60 * 60;
    
    private static long lastBackup = 0;
    private static String lastBackupUsername;
    
    public BackupCommand() {
        super(CommandCategory.ADMIN,
              "Performs a complete backup of the games's state. " +
              "This should not be confused with the @10FSAVE@ZZZ " +
              "command, which saves the game's state.",
              "",
              "This command can only be performed once per hour.");
    }
    
    @Override
    public void run(Player player) throws SyntaxException {
        String token = CommandProcessor.nextToken();
        if (CommandProcessor.nextToken() != null || token == null || !token.equalsIgnoreCase("now")) {
            throw new SyntaxException();
        }
        long now = System.currentTimeMillis();
        long diff = now - lastBackup;
        if (diff < ONE_HOUR) {
            player.sendText(true, "Last backup was performed @30F" + (diff / 60000) + " minutes@ZZZ ago by @10F" + lastBackupUsername + "@ZZZ.");
            player.sendText(true, "Please wait @30F60 minutes@ZZZ between backups.");
            return;
        }
        DateFormat format = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss-SSS");
        lastBackup = now;
        lastBackupUsername = player.getUsername();
        String filename = "aelfengard.backup-" + format.format(new Date()) + "-" + player.getUsername();
        PersistenceManager.doBackup(player, filename);
    }
    
    @Override
    public String[] getSyntax(Player player) {
        return new String[] { "NOW" };
    }

    public static void doSave(ObjectOutputStream oos) throws IOException {
        oos.writeInt(1); // protocol version
        oos.writeLong(lastBackup);
        oos.writeObject(lastBackupUsername);
    }

    public static void doLoad(ObjectInputStream ois) throws IOException, ClassNotFoundException {
        ois.readInt(); // protocol version
        lastBackup = ois.readLong();
        lastBackupUsername = (String) ois.readObject();
    }

}