from __future__ import annotations

from django.db import connections, DatabaseError
from django.utils import timezone
from rest_framework.decorators import api_view, permission_classes
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response

from config.master_business_views import _require_master_admin


def _row_to_did(row, cols) -> dict:
    d = dict(zip(cols, row))
    # Ensure string types for status
    if "status" in d and d["status"] is not None:
        d["status"] = str(d["status"])
    return d


def _did_columns():
    return ["did_id", "did_no", "bot_id", "business_id", "status", "changed_by", "created_at"]


@api_view(["GET"])
@permission_classes([IsAuthenticated])
def master_did_statistics(request):
    _, err = _require_master_admin(request)
    if err:
        return err

    try:
        with connections["default"].cursor() as cur:
            cur.execute("SELECT COUNT(*) FROM did_numbers")
            total = cur.fetchone()[0]
            cur.execute("SELECT COUNT(*) FROM did_numbers WHERE status = '1'")
            active = cur.fetchone()[0]
            cur.execute("SELECT COUNT(*) FROM did_numbers WHERE status = '0'")
            inactive = cur.fetchone()[0]
            cur.execute(
                "SELECT COUNT(*) FROM did_numbers WHERE MONTH(created_at) = MONTH(NOW()) AND YEAR(created_at) = YEAR(NOW())"
            )
            this_month = cur.fetchone()[0]
    except DatabaseError as e:
        return Response({"success": False, "message": str(e)}, status=500)

    return Response({
        "success": True,
        "data": {
            "total": total,
            "active": active,
            "inactive": inactive,
            "this_month": this_month,
        },
    })


@api_view(["GET", "POST"])
@permission_classes([IsAuthenticated])
def master_did_collection(request):
    _, err = _require_master_admin(request)
    if err:
        return err

    if request.method == "GET":
        try:
            with connections["default"].cursor() as cur:
                cur.execute(
                    "SELECT did_id, did_no, bot_id, business_id, status, changed_by, created_at "
                    "FROM did_numbers ORDER BY created_at DESC"
                )
                cols = [c[0] for c in cur.description]
                rows = [_row_to_did(r, cols) for r in cur.fetchall()]
        except DatabaseError as e:
            return Response({"success": False, "message": str(e)}, status=500)

        return Response({"success": True, "data": rows})

    # POST — create
    payload = request.data if isinstance(request.data, dict) else {}
    did_no = str(payload.get("did_number") or "").strip()
    bot_id = payload.get("bot_id")
    business_id = payload.get("business_id")
    status = str(payload.get("status") or "1")
    changed_by = payload.get("changed_by")

    if not did_no:
        return Response({"success": False, "message": "did_number is required."}, status=400)

    try:
        with connections["default"].cursor() as cur:
            cur.execute(
                "INSERT INTO did_numbers (did_no, bot_id, business_id, status, changed_by, created_at) "
                "VALUES (%s, %s, %s, %s, %s, NOW())",
                [did_no, bot_id, business_id, status, changed_by],
            )
            new_id = cur.lastrowid
            cur.execute(
                "SELECT did_id, did_no, bot_id, business_id, status, changed_by, created_at "
                "FROM did_numbers WHERE did_id = %s",
                [new_id],
            )
            cols = [c[0] for c in cur.description]
            row = _row_to_did(cur.fetchone(), cols)
    except DatabaseError as e:
        return Response({"success": False, "message": str(e)}, status=500)

    return Response({"success": True, "data": row}, status=201)


@api_view(["GET", "PUT", "PATCH", "DELETE"])
@permission_classes([IsAuthenticated])
def master_did_detail(request, did_id: int):
    _, err = _require_master_admin(request)
    if err:
        return err

    try:
        with connections["default"].cursor() as cur:
            cur.execute(
                "SELECT did_id, did_no, bot_id, business_id, status, changed_by, created_at "
                "FROM did_numbers WHERE did_id = %s",
                [did_id],
            )
            cols = [c[0] for c in cur.description]
            row = cur.fetchone()
    except DatabaseError as e:
        return Response({"success": False, "message": str(e)}, status=500)

    if not row:
        return Response({"success": False, "message": "DID number not found."}, status=404)

    if request.method == "GET":
        return Response({"success": True, "data": _row_to_did(row, cols)})

    if request.method == "DELETE":
        try:
            with connections["default"].cursor() as cur:
                cur.execute("DELETE FROM did_numbers WHERE did_id = %s", [did_id])
        except DatabaseError as e:
            return Response({"success": False, "message": str(e)}, status=500)
        return Response({"success": True, "message": "DID number deleted."})

    # PUT / PATCH — update
    payload = request.data if isinstance(request.data, dict) else {}
    fields = {}
    if "did_number" in payload:
        fields["did_no"] = str(payload["did_number"]).strip()
    if "bot_id" in payload:
        fields["bot_id"] = payload["bot_id"]
    if "business_id" in payload:
        fields["business_id"] = payload["business_id"]
    if "status" in payload:
        fields["status"] = str(payload["status"])
    if "changed_by" in payload:
        fields["changed_by"] = payload["changed_by"]

    if fields:
        set_clause = ", ".join(f"{k} = %s" for k in fields)
        values = list(fields.values()) + [did_id]
        try:
            with connections["default"].cursor() as cur:
                cur.execute(f"UPDATE did_numbers SET {set_clause} WHERE did_id = %s", values)
                cur.execute(
                    "SELECT did_id, did_no, bot_id, business_id, status, changed_by, created_at "
                    "FROM did_numbers WHERE did_id = %s",
                    [did_id],
                )
                cols = [c[0] for c in cur.description]
                updated = _row_to_did(cur.fetchone(), cols)
        except DatabaseError as e:
            return Response({"success": False, "message": str(e)}, status=500)
        return Response({"success": True, "data": updated, "message": "DID number updated."})

    return Response({"success": True, "data": _row_to_did(row, cols)})
