/*
 *   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 lombok.Getter;
import lombok.NonNull;
import lombok.RequiredArgsConstructor;

import javax.annotation.CheckReturnValue;
import javax.annotation.Nullable;
import java.util.List;
import java.util.Optional;

public interface RegionBackups {

    @RequiredArgsConstructor
    enum BackupType {
        MANUAL(5),
        AUTOMATIC(20),
        ;

        public final int maxBackups;
    }

    @RequiredArgsConstructor
    @Getter
    abstract class Backup {
        @NonNull
        private final BackupType type;

        @NonNull
        private final String name;

        @NonNull
        private final RegionData data;

        @CheckReturnValue
        public abstract boolean load();

        public abstract void delete();
    }

    @CheckReturnValue
    Optional<Backup> create(BackupType backupType);

    @NonNull
    List<Backup> list();

    @Nullable
    Backup get(String name);

    RegionBackups EMPTY = new RegionBackups() {
        @Override
        public Optional<Backup> create(BackupType backupType) {
            return Optional.empty();
        }

        @Override
        public @NonNull List<Backup> list() {
            return List.of();
        }

        @Nullable
        @Override
        public Backup get(String name) {
            return null;
        }
    };
}
