# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.

from django.urls import reverse
from django.utils.translation import gettext_lazy as _
from horizon import tables

from manila_ui.dashboards.project.shares import tables as shares_tables
from manila_ui import features


class MigrationStartAction(tables.LinkAction):
    name = "migration_start"
    verbose_name = _("Migrate Share")
    url = "horizon:admin:shares:migration_start"
    classes = ("ajax-modal",)
    policy_rules = (("share", "migration_start"),)
    ajax = True

    def allowed(self, request, share=None):
        if share:
            return (share.status.upper() == "AVAILABLE" and
                    not getattr(share, 'has_snapshot', False) and
                    features.is_migration_enabled())
        return False


class MigrationCompleteAction(tables.LinkAction):
    name = "migration_complete"
    verbose_name = _("Complete migration")
    url = "horizon:admin:shares:migration_complete"
    classes = ("ajax-modal",)
    policy_rules = (("share", "migration_complete"),)
    ajax = True

    def allowed(self, request, share=None):
        if (share and share.status.upper() == "MIGRATING" and
                features.is_migration_enabled()):
            return True
        return False


class MigrationCancelAction(tables.LinkAction):
    name = "migration_cancel"
    verbose_name = _("Cancel migration")
    url = "horizon:admin:shares:migration_cancel"
    classes = ("ajax-modal",)
    policy_rules = (("share", "migration_cancel"),)
    ajax = True

    def allowed(self, request, share=None):
        if (share and share.status.upper() == "MIGRATING" and
                features.is_migration_enabled()):
            return True
        return False


class MigrationGetProgressAction(tables.LinkAction):
    name = "migration_get_progress"
    verbose_name = _("Get migration progress")
    url = "horizon:admin:shares:migration_get_progress"
    classes = ("ajax-modal",)
    policy_rules = (("share", "migration_get_progress"),)
    ajax = True

    def allowed(self, request, share=None):
        if (share and share.status.upper() == "MIGRATING" and
                features.is_migration_enabled()):
            return True
        return False


class ManageShareAction(tables.LinkAction):
    name = "manage"
    verbose_name = _("Manage Share")
    url = "horizon:admin:shares:manage"
    classes = ("ajax-modal",)
    icon = "plus"
    policy_rules = (("share", "share_extension:share_manage"),)
    ajax = True


class UnmanageShareAction(tables.LinkAction):
    name = "unmanage"
    verbose_name = _("Unmanage Share")
    url = "horizon:admin:shares:unmanage"
    classes = ("ajax-modal",)
    icon = "pencil"
    policy_rules = (("share", "share_extension:share_unmanage"),)

    def allowed(self, request, share=None):
        if (not share or share.share_server_id or
                share.status.upper() not in shares_tables.DELETABLE_STATES):
            return False
        elif hasattr(share, 'has_snapshot'):
            return not share.has_snapshot
        return False


class ManageReplicas(tables.LinkAction):
    name = "manage_replicas"
    verbose_name = _("Manage Replicas")
    url = "horizon:admin:shares:manage_replicas"
    classes = ("btn-edit",)
    policy_rules = (("share", "share:replica_get_all"),)

    def allowed(self, request, share):
        share_replication_enabled = share.replication_type is not None
        return features.is_replication_enabled() and share_replication_enabled


class SharesTable(shares_tables.SharesTable):
    name = tables.WrappingColumn(
        "name", verbose_name=_("Name"),
        link="horizon:admin:shares:detail")
    host = tables.Column("host", verbose_name=_("Host"))
    project = tables.Column("project_name", verbose_name=_("Project"))

    def get_share_server_link(share):
        if getattr(share, 'share_server_id', None):
            return reverse("horizon:admin:share_servers:share_server_detail",
                           args=(share.share_server_id,))
        else:
            return None

    share_server = tables.Column(
        "share_server_id",
        verbose_name=_("Share Server"),
        link=get_share_server_link)

    class Meta(object):
        name = "shares"
        verbose_name = _("Shares")
        status_columns = ["status"]
        row_class = shares_tables.UpdateRow
        table_actions = (
            tables.NameFilterAction,
            ManageShareAction,
            shares_tables.DeleteShare,
        )
        row_actions = (
            ManageReplicas,
            MigrationStartAction,
            MigrationCompleteAction,
            MigrationGetProgressAction,
            MigrationCancelAction,
            UnmanageShareAction,
            shares_tables.DeleteShare,
        )
        columns = [
            'tenant', 'host', 'name', 'size', 'status', 'visibility',
            'share_type', 'protocol', 'share_server',
        ]
        if features.is_share_groups_enabled():
            columns.append('share_group_id')
