# By: Md. Fahim Bin Amin
# This file contains views for handling SolarWinds Service Desk integration setup requests.

from constants import api_paths, label_names as lnm, static_vars, var_names
from django.http import JsonResponse
from django.views.decorators.http import require_http_methods
from taskcallweb import settings
from translators import label_translator as lt
from utils import helpers
from validations import request_validator
import json


@require_http_methods(['POST'])
def get_solarwinds_sd_account(request):
    """
    Step 1: Retrieve SolarWinds SD account info.
    Only checks if domain + key exists for the org.
    """
    lang = request_validator.get_user_language(request)

    if not request_validator.user_in_session(request):
        return JsonResponse(
            lt.get_label(lnm.err_unauthorized_access, lang),
            status=401,
            safe=False
        )

    if settings.TEST_MODE:
        return JsonResponse(
            ["acme.samanage.com"],  # must be a list
            safe=False
        )

    status, output = helpers.post_api_request(
        api_paths.integrations_solarwinds_sd_account,
        {},
        request,
        lang=lang
    )
    # Guarantee list response for frontend JS
    if isinstance(output, list):
        return JsonResponse(output, status=status, safe=False)

    if isinstance(output, dict) and "accounts" in output:
        return JsonResponse(output["accounts"], status=status, safe=False)

    # Fallback safety
    return JsonResponse([], status=status, safe=False)


@require_http_methods(['POST'])
def update_solarwinds_sd_account(request):
    """
    Step 1(b): Update SolarWinds username + API key.
    """
    lang = request_validator.get_user_language(request)

    if not request_validator.user_in_session(request):
        return JsonResponse(
            lt.get_label(lnm.err_unauthorized_access, lang),
            status=401,
            safe=False
        )

    body = json.loads(request.body.decode())

    if settings.TEST_MODE:
        return JsonResponse(True, safe=False)

    status, output = helpers.post_api_request(
        api_paths.integrations_solarwinds_sd_account_update,
        body,
        request,
        lang=lang
    )
    return JsonResponse(output, status=status, safe=False)


@require_http_methods(['POST'])
def initiate_solarwinds_sd_integration(request):
    lang = request_validator.get_user_language(request)

    if not request_validator.user_in_session(request):
        return JsonResponse(
            lt.get_label(lnm.err_unauthorized_access, lang),
            status=401,
            safe=False
        )

    body = json.loads(request.body.decode())

    # Must include integration name + domain
    if var_names.integration_name in body and var_names.vendor_endpoint_name in body:
        session_data = {
            var_names.integration_name: body[var_names.integration_name],
            var_names.vendor_endpoint_name: body[
                var_names.vendor_endpoint_name],
            var_names.service_ref_id: body[var_names.service_ref_id],
            var_names.integration_type: body[var_names.integration_type]
        }

        # Only save API token (password field) - username not needed
        if var_names.password in body:
            session_data[var_names.password] = body[var_names.password]

        request.session[var_names.services] = session_data

        return JsonResponse(lt.get_label(lnm.msg_success, lang), safe=False)

    return JsonResponse(
        lt.get_label(lnm.err_invalid_request, lang),
        status=401,
        safe=False
    )


@require_http_methods(['POST'])
def get_solarwinds_sd_meta_data(request):
    lang = request_validator.get_user_language(request)

    if not request_validator.user_in_session(request):
        return JsonResponse(
            lt.get_label(lnm.err_unauthorized_access, lang),
            status=401,
            safe=False
        )

    body = json.loads(request.body.decode())

    # If integration_key IS NOT provided → new integration flow
    if var_names.integration_key not in body:
        serv_session = request.session[var_names.services]

        # Send domain and API token to backend
        body[var_names.vendor_endpoint_name] = serv_session[
            var_names.vendor_endpoint_name]

        # Only need API token (password field)
        if var_names.password in serv_session:
            body[var_names.password] = serv_session[var_names.password]

    # Test Mode
    if settings.TEST_MODE:
        return JsonResponse(
            [
                [{"item_id": 1, "name": "Default"}],
                [
                    {"item_id": 1, "name": "General"},
                    {"item_id": 2, "name": "Network"},
                    {"item_id": 3, "name": "Hardware"}
                ],
                [
                    {"item_id": "critical", "name": "Critical"},
                    {"item_id": "high", "name": "High"},
                    {"item_id": "medium", "name": "Medium"},
                    {"item_id": "low", "name": "Low"}
                ],
                [
                    {"item_id": "New", "name": "New"},
                    {"item_id": "In Progress", "name": "In Progress"},
                    {"item_id": "Pending", "name": "Pending"},
                    {"item_id": "Resolved", "name": "Resolved"}
                ]
            ],
            safe=False
        )

    status, output = helpers.post_api_request(
        api_paths.integrations_solarwinds_sd_meta_data,
        body,
        request,
        lang=lang
    )

    # Return as array format for JS
    if isinstance(output, list):
        return JsonResponse(output, status=status, safe=False)

    # If backend returns object format, convert to array
    formatted = [
        output.get("accounts", []),
        output.get("categories", []),
        output.get("priorities", []),
        output.get("states", output.get("statuses", []))
    ]

    return JsonResponse(formatted, status=status, safe=False)


@require_http_methods(['POST'])
def create_solarwinds_sd_integration(request):
    """
    Step 4: Create SolarWinds SD integration.
    """
    lang = request_validator.get_user_language(request)

    if (
        not request_validator.user_in_session(request)
        or var_names.services not in request.session
        or request.session[var_names.services].get(var_names.integration_type) != static_vars.integ_type_solarwinds_servicedesk
        or var_names.service_ref_id not in request.session[var_names.services]
        or var_names.integration_name not in request.session[var_names.services]
    ):
        return JsonResponse(
            lt.get_label(lnm.err_unauthorized_access, lang),
            status=401,
            safe=False
        )

    serv_session = request.session[var_names.services]
    req_body = json.loads(request.body.decode())

    # -------- FINAL CLEAN PAYLOAD --------
    post_body = {
        var_names.service_ref_id: serv_session[var_names.service_ref_id],
        var_names.integration_type: static_vars.integ_type_solarwinds_servicedesk,
        var_names.integration_name: serv_session[var_names.integration_name],
        var_names.vendor_endpoint_name: serv_session[var_names.vendor_endpoint_name],
        var_names.additional_info: req_body[var_names.additional_info]
    }
    # -------------------------------------

    if settings.TEST_MODE:
        return JsonResponse("Action performed successfully", safe=False)

    status, output = helpers.post_api_request(
        api_paths.services_integrations_add,
        post_body,
        request,
        lang=lang
    )

    return JsonResponse(output, status=status, safe=False)


@require_http_methods(['POST'])
def edit_solarwinds_sd_integration(request):
    """
    Step 5: Edit existing SolarWinds SD integration.
    Identical pattern to TeamDynamix edit.
    """
    lang = request_validator.get_user_language(request)

    if not request_validator.user_in_session(request):
        return JsonResponse(
            lt.get_label(lnm.err_unauthorized_access, lang),
            status=401,
            safe=False
        )

    body = json.loads(request.body.decode())

    if settings.TEST_MODE:
        return JsonResponse("Action performed successfully", safe=False)

    status, output = helpers.post_api_request(
        api_paths.services_integrations_edit,
        body,
        request,
        lang=lang
    )

    return JsonResponse(output, status=status, safe=False)