"""Storage devices mutations"""

import strawberry
from selfprivacy_api.graphql import IsAuthenticated
from selfprivacy_api.graphql.common_types.jobs import job_to_api_job
from selfprivacy_api.utils.block_devices import BlockDevices
from selfprivacy_api.graphql.mutations.mutation_interface import (
    GenericJobMutationReturn,
    GenericMutationReturn,
)
from selfprivacy_api.jobs.migrate_to_binds import (
    BindMigrationConfig,
    is_bind_migrated,
    start_bind_migration,
)


@strawberry.input
class MigrateToBindsInput:
    """Migrate to binds input"""

    email_block_device: str
    bitwarden_block_device: str
    gitea_block_device: str
    nextcloud_block_device: str
    pleroma_block_device: str


@strawberry.type
class StorageMutations:
    @strawberry.mutation(permission_classes=[IsAuthenticated])
    def resize_volume(self, name: str) -> GenericMutationReturn:
        """Resize volume"""
        volume = BlockDevices().get_block_device(name)
        if volume is None:
            return GenericMutationReturn(
                success=False, code=404, message="Volume not found"
            )
        volume.resize()
        return GenericMutationReturn(
            success=True, code=200, message="Volume resize started"
        )

    @strawberry.mutation(permission_classes=[IsAuthenticated])
    def mount_volume(self, name: str) -> GenericMutationReturn:
        """Mount volume"""
        volume = BlockDevices().get_block_device(name)
        if volume is None:
            return GenericMutationReturn(
                success=False, code=404, message="Volume not found"
            )
        is_success = volume.mount()
        if is_success:
            return GenericMutationReturn(
                success=True,
                code=200,
                message="Volume mounted, rebuild the system to apply changes",
            )
        return GenericMutationReturn(
            success=False, code=409, message="Volume not mounted (already mounted?)"
        )

    @strawberry.mutation(permission_classes=[IsAuthenticated])
    def unmount_volume(self, name: str) -> GenericMutationReturn:
        """Unmount volume"""
        volume = BlockDevices().get_block_device(name)
        if volume is None:
            return GenericMutationReturn(
                success=False, code=404, message="Volume not found"
            )
        is_success = volume.unmount()
        if is_success:
            return GenericMutationReturn(
                success=True,
                code=200,
                message="Volume unmounted, rebuild the system to apply changes",
            )
        return GenericMutationReturn(
            success=False, code=409, message="Volume not unmounted (already unmounted?)"
        )

    @strawberry.mutation(permission_classes=[IsAuthenticated])
    def migrate_to_binds(self, input: MigrateToBindsInput) -> GenericJobMutationReturn:
        """Migrate to binds"""
        if is_bind_migrated():
            return GenericJobMutationReturn(
                success=False, code=409, message="Already migrated to binds"
            )
        job = start_bind_migration(
            BindMigrationConfig(
                email_block_device=input.email_block_device,
                bitwarden_block_device=input.bitwarden_block_device,
                gitea_block_device=input.gitea_block_device,
                nextcloud_block_device=input.nextcloud_block_device,
                pleroma_block_device=input.pleroma_block_device,
            )
        )
        return GenericJobMutationReturn(
            success=True,
            code=200,
            message="Migration to binds started, rebuild the system to apply changes",
            job=job_to_api_job(job),
        )