from uuid import uuid4

from django.db import transaction
from django.db.models import Q
from django.utils import timezone
from rest_framework import status
from rest_framework.permissions import IsAdminUser
from rest_framework.response import Response
from rest_framework.views import APIView

from apps.accounts.models import User
from apps.business.marketplace.models_part1 import Vendor


class AdminVendorListCreateView(APIView):
    permission_classes = [IsAdminUser]

    def get(self, request):
        try:
            page = max(1, int(request.query_params.get("page", 1) or 1))
        except (TypeError, ValueError):
            page = 1
        try:
            page_size = min(100, max(1, int(request.query_params.get("page_size", 20) or 20)))
        except (TypeError, ValueError):
            page_size = 20
        q = (request.query_params.get("q") or "").strip()
        status_filter = (request.query_params.get("status") or "").strip().upper()

        qs = Vendor.objects.select_related("user").all().order_by("-created_at")
        if q:
            qs = qs.filter(
                Q(company_name__icontains=q)
                | Q(store_name__icontains=q)
                | Q(user__mobile__icontains=q)
                | Q(user__email__icontains=q)
            )
        if status_filter:
            qs = qs.filter(status=status_filter)

        total = qs.count()
        start = (page - 1) * page_size
        end = start + page_size

        rows = [
            {
                "id": str(v.id),
                "user_id": str(v.user_id),
                "user_name": f"{(v.user.first_name or '').strip()} {(v.user.last_name or '').strip()}".strip() or (v.user.mobile or v.user.email or str(v.user_id)),
                "user_mobile": v.user.mobile,
                "user_email": v.user.email,
                "company_name": v.company_name,
                "store_name": v.store_name,
                "status": v.status,
                "is_active": v.is_active,
                "approval_date": v.approval_date,
                "created_at": v.created_at,
            }
            for v in qs[start:end]
        ]
        return Response({"count": total, "results": rows, "page": page, "page_size": page_size})

    def post(self, request):
        user_id = request.data.get("user_id")
        if not user_id:
            return Response({"detail": "user_id is required."}, status=status.HTTP_400_BAD_REQUEST)

        user = User.objects.filter(id=user_id).first()
        if not user:
            return Response({"detail": "User not found."}, status=status.HTTP_404_NOT_FOUND)

        company_name = (request.data.get("company_name") or "").strip() or f"{(user.first_name or '').strip()} {(user.last_name or '').strip()}".strip() or f"Vendor {user.id}"
        store_name = (request.data.get("store_name") or "").strip() or company_name
        business_email = (request.data.get("business_email") or user.email or "vendor@truewave.local").strip()
        business_phone = (request.data.get("business_phone") or user.mobile or "0000000000").strip()
        business_address = (request.data.get("business_address") or "Not Provided").strip()
        city = (request.data.get("city") or "Not Provided").strip()
        state_name = (request.data.get("state") or "Not Provided").strip()
        pincode = (request.data.get("pincode") or "000000").strip()

        requested_status = (request.data.get("status") or "APPROVED").strip().upper()
        if requested_status not in {"PENDING", "APPROVED", "SUSPENDED", "REJECTED"}:
            return Response({"detail": "Invalid status value."}, status=status.HTTP_400_BAD_REQUEST)

        reg_no = (request.data.get("company_registration_number") or "").strip() or f"REG-{uuid4().hex[:12].upper()}"
        tax_id = (request.data.get("tax_id") or "").strip() or f"TAX-{uuid4().hex[:12].upper()}"

        with transaction.atomic():
            vendor = Vendor.objects.filter(user=user).first()
            if vendor:
                return Response({"detail": "Vendor already exists for this user.", "vendor_id": str(vendor.id)}, status=status.HTTP_409_CONFLICT)

            vendor = Vendor.objects.create(
                user=user,
                company_name=company_name,
                company_registration_number=reg_no,
                tax_id=tax_id,
                business_email=business_email,
                business_phone=business_phone,
                business_address=business_address,
                city=city,
                state=state_name,
                pincode=pincode,
                country=(request.data.get("country") or "India").strip() or "India",
                store_name=store_name,
                store_description=(request.data.get("store_description") or "").strip(),
                status=requested_status,
                is_active=requested_status == "APPROVED",
                approval_date=timezone.now() if requested_status == "APPROVED" else None,
            )

            user.role = "VENDOR"
            user.save(update_fields=["role"])

        return Response(
            {
                "id": str(vendor.id),
                "user_id": str(vendor.user_id),
                "company_name": vendor.company_name,
                "store_name": vendor.store_name,
                "status": vendor.status,
                "is_active": vendor.is_active,
            },
            status=status.HTTP_201_CREATED,
        )


class AdminVendorDetailView(APIView):
    permission_classes = [IsAdminUser]

    def patch(self, request, vendor_id):
        vendor = Vendor.objects.select_related("user").filter(id=vendor_id).first()
        if not vendor:
            return Response({"detail": "Vendor not found."}, status=status.HTTP_404_NOT_FOUND)

        allowed_fields = {
            "company_name",
            "store_name",
            "store_description",
            "business_email",
            "business_phone",
            "business_address",
            "city",
            "state",
            "pincode",
            "country",
        }

        for field in allowed_fields:
            if field in request.data:
                setattr(vendor, field, (request.data.get(field) or "").strip())

        if "status" in request.data:
            next_status = str(request.data.get("status") or "").upper().strip()
            if next_status not in {"PENDING", "APPROVED", "SUSPENDED", "REJECTED"}:
                return Response({"detail": "Invalid status value."}, status=status.HTTP_400_BAD_REQUEST)
            vendor.status = next_status
            vendor.is_active = next_status == "APPROVED"
            if next_status == "APPROVED":
                vendor.approval_date = timezone.now()
                vendor.user.role = "VENDOR"
                vendor.user.save(update_fields=["role"])

        if "is_active" in request.data:
            vendor.is_active = bool(request.data.get("is_active"))

        vendor.save()

        return Response(
            {
                "id": str(vendor.id),
                "user_id": str(vendor.user_id),
                "company_name": vendor.company_name,
                "store_name": vendor.store_name,
                "status": vendor.status,
                "is_active": vendor.is_active,
                "approval_date": vendor.approval_date,
            }
        )
