/*
 * This file is a part of the SteamWar software.
 *
 * Copyright (C) 2021  SteamWar.de-Serverteam
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */

package de.steamwar.bausystem.region;

import de.steamwar.bausystem.BauSystem;
import de.steamwar.bausystem.region.tags.Tag;
import de.steamwar.linkage.Linked;
import de.steamwar.linkage.api.Enable;
import org.bukkit.scheduler.BukkitRunnable;

import java.util.Iterator;


@Linked
public class BackupScheduler implements Enable {

    private static final long INITIAL = 20 * 60 * 5;
    private static final long PERIOD = 20 * 60 * 30;

    @Override
    public void enable() {
        new BukkitRunnable() {
            @Override
            public void run() {
                final Iterator<Region> regions = Region.getREGION_MAP().values().stream().filter(region -> region.get(Tag.CHANGED)).iterator();
                BackupScheduler.this.doBackup(regions);
            }
        }.runTaskTimer(BauSystem.getInstance(), INITIAL, PERIOD);
    }

    public void doBackup(final Iterator<Region> regionIterator) {
        new BukkitRunnable() {
            @Override
            public void run() {
                if (!regionIterator.hasNext()) {
                    this.cancel();
                    return;
                }

                final Region region = regionIterator.next();
                if (region.backup()) {
                    region.remove(Tag.CHANGED);
                }
            }
        }.runTaskTimer(BauSystem.getInstance(), 0, 20 * 60);
    }
}