from rest_framework import status
from rest_framework.exceptions import ValidationError

from api.views.admin.base import AdminApiBase
from api.validator import BaseValidator
from api.utils import decrypt_aes_128_cbc, log_critical_error, get_exception_detail
from api.translation import __


class SetPassword(AdminApiBase):
    def validate_request(self, request):
        rules = {
            "password": "required",
            "confirm_password": "required",
        }

        validator = BaseValidator(request.data, rules)
        error = validator.validate()

        if error:
            raise ValidationError(error)

    def post(self, request):
        try:
            self.validate_request(request)

            encrypted_password = request.data.get("password")
            encrypted_confirm_password = request.data.get("confirm_password")

            try:
                password = decrypt_aes_128_cbc(encrypted_password)
                confirm_password = decrypt_aes_128_cbc(encrypted_confirm_password)
            except Exception:
                raise ValidationError({
                    "error": "Invalid password format",
                    "errors": {
                        "password": "Invalid password format"
                    }
                })

            if password != confirm_password:
                raise ValidationError({
                    "error": "Password and confirm password do not match",
                    "errors": {
                        "confirm_password": "Password and confirm password do not match"
                    }
                })

            if len(password) < 8:
                raise ValidationError({
                    "error": "Password must be at least 8 characters",
                    "errors": {
                        "password": "Password must be at least 8 characters"
                    }
                })

            user = request.user

            user.set_password(password)
            user.can_login_with_password = True
            user.save(update_fields=[
                "password",
                "can_login_with_password",
                "updated_at",
            ])

            return self.api_response(data={
                "message": "Password set successfully",
                "can_login_with_password": user.can_login_with_password,
            })

        except ValidationError as e:
            first_message = e.detail.get("error")
            errors = e.detail.get("errors")

            return self.api_response(
                error=first_message,
                errors=errors,
                code=status.HTTP_400_BAD_REQUEST
            )

        except Exception as e:
            e_details = get_exception_detail(e)

            log_critical_error(
                user_id=getattr(request.user, "id", None),
                descr=e_details["descr"],
                url=e_details["url"],
                trace=e_details["trace"]
            )

            return self.api_response(
                error=__("message.internal_server_error"),
                code=status.HTTP_500_INTERNAL_SERVER_ERROR
            )