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

import com.velocitypowered.api.event.Subscribe;
import com.velocitypowered.api.event.connection.DisconnectEvent;
import com.velocitypowered.api.event.connection.PostLoginEvent;
import com.velocitypowered.api.event.player.ServerConnectedEvent;
import com.velocitypowered.api.proxy.Player;
import de.steamwar.linkage.Linked;
import de.steamwar.messages.Chatter;
import de.steamwar.persistent.Bauserver;
import de.steamwar.persistent.Subserver;
import de.steamwar.sql.SchematicNode;
import de.steamwar.sql.SchematicType;
import de.steamwar.velocitycore.commands.CheckCommand;

import java.util.ArrayList;
import java.util.List;

@Linked
public class CheckListener extends BasicListener {

    @Subscribe
    public void onPlayerJoin(PostLoginEvent e) {
        Chatter sender = Chatter.of(e.getPlayer());

        List<SchematicNode> uncheckedSchematics = new ArrayList<>();
        for (SchematicType type : SchematicType.values()) {
            if (type.check()) {
                uncheckedSchematics.addAll(SchematicNode.getAllSchematicsOfType(sender.user().getId(), type.toDB()));
            }
        }

        if (!uncheckedSchematics.isEmpty()) {
            sender.system("CHECK_UNCHECKED", uncheckedSchematics.size());
        }
    }

    @Subscribe
    public void onServerSwitch(ServerConnectedEvent e) {
        Player player = e.getPlayer();
        if (CheckCommand.isChecking(player)) {
            Subserver server = Subserver.getSubserver(e.getServer().getServerInfo());
            if (!Subserver.isBuild(server) || ((Bauserver) server).getOwner() != player.getUniqueId()) {
                CheckCommand.abort(player);
            }
        }
    }

    @Subscribe
    public void onPlayerDisconnect(DisconnectEvent e) {
        Player player = e.getPlayer();
        if (CheckCommand.isChecking(player)) {
            CheckCommand.abort(player);
        }
    }
}
