from rest_framework import serializers
from django.contrib.auth import get_user_model

from .models import GymSettings

User = get_user_model()


class LoginSerializer(serializers.Serializer):
    email = serializers.EmailField()
    password = serializers.CharField(write_only=True)


class VerifyOTPSerializer(serializers.Serializer):
    email = serializers.EmailField()
    code = serializers.CharField(max_length=6, min_length=6)


class RegisterSerializer(serializers.Serializer):
    name = serializers.CharField(max_length=255)
    email = serializers.EmailField()
    phone = serializers.CharField(max_length=20, required=False, default="")
    password = serializers.CharField(write_only=True, min_length=8)
    gym_name = serializers.CharField(max_length=255, required=False, default="")
    package_id = serializers.CharField(max_length=255, required=False, default="")

    def validate_email(self, value):
        if User.objects.filter(email=value).exists():
            raise serializers.ValidationError("An account with this email already exists.")
        return value


class UserSerializer(serializers.ModelSerializer):
    name = serializers.SerializerMethodField()
    role = serializers.SerializerMethodField()
    has_subscription = serializers.SerializerMethodField()
    subscription_tier = serializers.SerializerMethodField()

    class Meta:
        model = User
        fields = [
            "id", "name", "email", "phone", "role", "is_superuser",
            "is_active_member", "date_joined", "has_subscription", "subscription_tier",
        ]

    def get_name(self, obj):
        return obj.get_full_name() or obj.username

    def get_role(self, obj):
        # Django superusers are always treated as owners
        if obj.is_superuser:
            return "owner"
        return obj.role

    def get_has_subscription(self, obj):
        if obj.is_superuser:
            return True
        return obj.subscriptions.filter(status="active").exists()

    def get_subscription_tier(self, obj):
        if obj.is_superuser:
            return "Enterprise"
        sub = obj.subscriptions.filter(status="active").order_by("-created_at").first()
        if sub:
            return sub.package_name or (sub.package.name if sub.package else "Free")
        return "Free"


class UpdateProfileSerializer(serializers.ModelSerializer):
    name = serializers.CharField(write_only=True, required=False)

    class Meta:
        model = User
        fields = ["name", "phone"]

    def update(self, instance, validated_data):
        name = validated_data.pop("name", None)
        if name:
            parts = name.strip().split(" ", 1)
            instance.first_name = parts[0]
            instance.last_name = parts[1] if len(parts) > 1 else ""
        for attr, value in validated_data.items():
            setattr(instance, attr, value)
        instance.save()
        return instance


class ChangePasswordSerializer(serializers.Serializer):
    current_password = serializers.CharField(write_only=True)
    new_password = serializers.CharField(write_only=True, min_length=8)

    def validate_new_password(self, value):
        if len(value) < 8:
            raise serializers.ValidationError("Password must be at least 8 characters.")
        return value


class ForgotPasswordSerializer(serializers.Serializer):
    email = serializers.EmailField()


class ResetPasswordSerializer(serializers.Serializer):
    email = serializers.EmailField()
    code = serializers.CharField(max_length=6, min_length=6)
    new_password = serializers.CharField(write_only=True, min_length=8)

    def validate_new_password(self, value):
        if len(value) < 8:
            raise serializers.ValidationError("Password must be at least 8 characters.")
        return value


class GymSettingsSerializer(serializers.ModelSerializer):
    class Meta:
        model = GymSettings
        fields = [
            "id", "gym_name", "logo", "favicon",
            "primary_color", "secondary_color",
            "currency", "tax_rate", "timezone",
            "business_hours", "contact_email", "contact_phone", "website_url",
        ]
        read_only_fields = ["id"]
