/*
 *   This file is a part of the SteamWar software.
 *
 *   Copyright (C) 2025 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.flags.ChangedMode;
import de.steamwar.bausystem.region.flags.Flag;
import de.steamwar.linkage.Linked;
import de.steamwar.linkage.api.Enable;
import org.bukkit.scheduler.BukkitRunnable;

import java.util.Iterator;
import java.util.Optional;

@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() {
                Iterator<Region> regionsToBackup = RegionSystem.INSTANCE.getRegions()
                        .filter(region -> region.getRegionData().has(Flag.CHANGED).isReadable())
                        .filter(region -> region.getRegionData().get(Flag.CHANGED).isWithDefault(ChangedMode.HAS_CHANGE))
                        .iterator();
                if (!regionsToBackup.hasNext()) return;
                doBackup(regionsToBackup);
            }
        }.runTaskTimer(BauSystem.getInstance(), INITIAL, PERIOD);
    }

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

                Region region = regionsToBackup.next();
                Optional<RegionBackups.Backup> backup = region.getBackups()
                        .create(RegionBackups.BackupType.AUTOMATIC);
                if (backup.isPresent()) {
                    region.getRegionData().set(Flag.CHANGED, ChangedMode.NO_CHANGE);
                }
            }
        }.runTaskTimer(BauSystem.getInstance(), 0, 20 * 60);
    }
}
