package dev.lions.unionflow.server.resource;

import dev.lions.unionflow.server.api.dto.backup.request.CreateBackupRequest;
import dev.lions.unionflow.server.api.dto.backup.request.RestoreBackupRequest;
import dev.lions.unionflow.server.api.dto.backup.request.UpdateBackupConfigRequest;
import dev.lions.unionflow.server.api.dto.backup.response.BackupConfigResponse;
import dev.lions.unionflow.server.api.dto.backup.response.BackupResponse;
import dev.lions.unionflow.server.service.BackupService;
import jakarta.annotation.security.RolesAllowed;
import jakarta.inject.Inject;
import jakarta.validation.Valid;
import jakarta.ws.rs.*;
import jakarta.ws.rs.core.MediaType;
import jakarta.ws.rs.core.Response;
import lombok.extern.slf4j.Slf4j;
import org.eclipse.microprofile.openapi.annotations.Operation;
import org.eclipse.microprofile.openapi.annotations.tags.Tag;

import java.util.List;
import java.util.UUID;

/**
 * REST Resource pour la gestion des sauvegardes système
 */
@Slf4j
@Path("/api/backups")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
@Tag(name = "Sauvegardes", description = "Gestion des sauvegardes et restaurations")
public class BackupResource {

    @Inject
    BackupService backupService;

    /**
     * Lister toutes les sauvegardes
     */
    @GET
    @RolesAllowed({"SUPER_ADMIN", "ADMIN", "MODERATEUR"})
    @Operation(summary = "Lister toutes les sauvegardes disponibles")
    public List<BackupResponse> getAllBackups() {
        log.info("GET /api/backups");
        return backupService.getAllBackups();
    }

    /**
     * Récupérer une sauvegarde par ID
     */
    @GET
    @Path("/{id}")
    @RolesAllowed({"SUPER_ADMIN", "ADMIN", "MODERATEUR"})
    @Operation(summary = "Récupérer une sauvegarde par ID")
    public BackupResponse getBackupById(@PathParam("id") UUID id) {
        log.info("GET /api/backups/{}", id);
        return backupService.getBackupById(id);
    }

    /**
     * Créer une nouvelle sauvegarde
     */
    @POST
    @RolesAllowed({"SUPER_ADMIN", "ADMIN"})
    @Operation(summary = "Créer une nouvelle sauvegarde")
    public Response createBackup(@Valid CreateBackupRequest request) {
        log.info("POST /api/backups - {}", request.getName());
        BackupResponse backup = backupService.createBackup(request);
        return Response.status(Response.Status.CREATED).entity(backup).build();
    }

    /**
     * Restaurer une sauvegarde
     */
    @POST
    @Path("/restore")
    @RolesAllowed({"SUPER_ADMIN", "ADMIN"})
    @Operation(summary = "Restaurer une sauvegarde")
    public Response restoreBackup(@Valid RestoreBackupRequest request) {
        log.info("POST /api/backups/restore - backupId={}", request.getBackupId());
        backupService.restoreBackup(request);
        return Response.ok().entity(java.util.Map.of("message", "Restauration en cours")).build();
    }

    /**
     * Supprimer une sauvegarde
     */
    @DELETE
    @Path("/{id}")
    @RolesAllowed({"SUPER_ADMIN", "ADMIN"})
    @Operation(summary = "Supprimer une sauvegarde")
    public Response deleteBackup(@PathParam("id") UUID id) {
        log.info("DELETE /api/backups/{}", id);
        backupService.deleteBackup(id);
        return Response.ok().entity(java.util.Map.of("message", "Sauvegarde supprimée avec succès")).build();
    }

    /**
     * Récupérer la configuration des sauvegardes automatiques
     */
    @GET
    @Path("/config")
    @RolesAllowed({"SUPER_ADMIN", "ADMIN", "MODERATEUR"})
    @Operation(summary = "Récupérer la configuration des sauvegardes automatiques")
    public BackupConfigResponse getBackupConfig() {
        log.info("GET /api/backups/config");
        return backupService.getBackupConfig();
    }

    /**
     * Mettre à jour la configuration des sauvegardes automatiques
     */
    @PUT
    @Path("/config")
    @RolesAllowed({"SUPER_ADMIN", "ADMIN"})
    @Operation(summary = "Mettre à jour la configuration des sauvegardes automatiques")
    public BackupConfigResponse updateBackupConfig(@Valid UpdateBackupConfigRequest request) {
        log.info("PUT /api/backups/config");
        return backupService.updateBackupConfig(request);
    }

    /**
     * Créer un point de restauration
     */
    @POST
    @Path("/restore-point")
    @RolesAllowed({"SUPER_ADMIN", "ADMIN"})
    @Operation(summary = "Créer un point de restauration")
    public Response createRestorePoint() {
        log.info("POST /api/backups/restore-point");
        BackupResponse backup = backupService.createRestorePoint();
        return Response.status(Response.Status.CREATED).entity(backup).build();
    }
}
