from io import BytesIO

from django.http import HttpResponse
from openpyxl import Workbook
from rest_framework import viewsets
from rest_framework.decorators import action

from apps.authorization.api.v1.serializers import UserRelationSerializer
from apps.authorization.models import UserRelations
from apps.core.mixins.search_mixin import DynamicSearchMixin
from common.helper_excel import excel_description, create_header_freez, create_value


class AuthExcelViewSet(viewsets.ModelViewSet, DynamicSearchMixin):
    queryset = UserRelations.objects.all()
    serializer_class = UserRelationSerializer

    # noqa # کاربران
    @action(
        methods=['get'],
        detail=False,
        url_path='user_relations_excel',
        url_name='user_relations_excel',
        name='user_relations_excel'
    )
    def user_relations_excel(self, request):
        output = BytesIO()
        workbook = Workbook()
        worksheet = workbook.active
        worksheet.sheet_view.rightToLeft = True
        worksheet.insert_rows(1)

        queryset = self.filter_queryset(self.get_queryset().order_by('-create_date'))  # noqa

        ser_data = self.get_serializer(queryset, many=True).data

        excel_options = [
            "ردیف",
            "نام کاربری",
            "نام",
            "نام خانوادگی",
            "سازمان",
            "نقش",
            "موبایل",
            "کد ملی",
            "استان/شهر",
            "آدرس",
            "وضعیت",
            "دسترسی ها"
        ]

        excel_description(worksheet, 'B1', f'کاربران', row2='C3')

        create_header_freez(worksheet, excel_options, 1, 6, 7, height=25, width=20)
        l = 6
        m = 1

        fa_permissions_dict = {
            "permission_control": "مدیریت دسترسی",
            "users": "کاربران",
            "organizations": "سازمان ها",
            "roles_management": "مدیریت نقش",
            "feed_input_products": "محصولات",
            "product_categories": "دسته بندی محصولات",
            "pricing": "قیمت گذاری",
            "incentive_plans": "طرح های تشویقی",
            "quota": "سهم بندی",
            "quota_distributions": "صفحه توزیع سهمیه",
            "inventory": "انبار"
        }

        if ser_data:
            for data in ser_data:
                is_active = 'فعال' if (data.get('user') or {}).get('is_active', False) else 'غیرفعال'

                city = str((data.get('user') or {}).get('city_name', '')) or '-'
                province = str((data.get('user') or {}).get('province_name', '')) or '-'
                city_province = f"{city}/{province}" if city != '-' or province != '-' else '-'
                try:
                    if data.get('permissions') and isinstance(data['permissions'], list):
                        permission_names = []
                        for perm in data['permissions']:
                            if isinstance(perm, dict) and 'page_name' in perm:
                                permission_names.append(perm['page_name'])

                        fa_permissions = [fa_permissions_dict.get(name, name) for name in permission_names]
                        fa_permission_text = ' - '.join(fa_permissions) if fa_permissions else '-'
                    else:
                        fa_permission_text = '-'
                except (KeyError, TypeError):
                    fa_permission_text = '-'

                list1 = [
                    m,
                    (data.get('user') or {}).get('username', '') or '-',
                    (data.get('user') or {}).get('first_name', '') or '-',
                    (data.get('user') or {}).get('last_name', '') or '-',
                    (data.get('organization') or {}).get('name', '') or '-',
                    (data.get('role') or {}).get('role_name', '') or '-',
                    str((data.get('user') or {}).get('mobile', '')) or '-',
                    str((data.get('user') or {}).get('national_code', '')) or '-',
                    city_province,
                    str((data.get('user') or {}).get('address', '')) or '-',
                    is_active,
                    fa_permission_text
                ]
                create_value(worksheet, list1, l + 1, 1, m=m)

                m += 1
                l += 1

        workbook.save(output)
        output.seek(0)

        response = HttpResponse(
            content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')  # noqa
        response[
            'Content-Disposition'] = f'attachment; filename="کاربران.xlsx"'.encode(  # noqa
            'utf-8')
        response.write(output.getvalue())
        return response
