"""
Unit Tests - API Serializers.

تست‌های واحد سریالایزرهای API ماژول HRM.
"""
import pytest
from datetime import date
from uuid import uuid4


class TestEmployeeSerializer:
    """تست‌های سریالایزر کارمند."""

    def test_valid_data(self):
        data = {
            "employee_code": "EMP001",
            "first_name": "علی",
            "last_name": "احمدی",
            "national_code": "0012345678",
            "hire_date": "2024-01-01",
        }
        from modules.hrm.backend.api.v1.serializers import EmployeeSerializer
        serializer = EmployeeSerializer(data=data)
        assert serializer.is_valid(), serializer.errors

    def test_invalid_national_code(self):
        data = {
            "employee_code": "EMP001",
            "first_name": "علی",
            "last_name": "احمدی",
            "national_code": "123",  # too short
            "hire_date": "2024-01-01",
        }
        from modules.hrm.backend.api.v1.serializers import EmployeeSerializer
        serializer = EmployeeSerializer(data=data)
        assert not serializer.is_valid()
        assert "national_code" in serializer.errors


class TestTerminateSerializer:
    """تست‌های سریالایزر خاتمه همکاری."""

    def test_valid_data(self):
        from modules.hrm.backend.api.v1.serializers import TerminateEmployeeSerializer
        data = {
            "termination_date": "2024-12-31",
            "reason": "استعفا",
        }
        serializer = TerminateEmployeeSerializer(data=data)
        assert serializer.is_valid(), serializer.errors


class TestLeaveRequestSerializer:
    """تست‌های سریالایزر درخواست مرخصی."""

    def test_valid_data(self):
        from modules.hrm.backend.api.v1.serializers import LeaveRequestSerializer
        data = {
            "employee_id": str(uuid4()),
            "leave_type": "ANNUAL",
            "start_date": "2024-06-01",
            "end_date": "2024-06-03",
            "days_count": 3,
        }
        serializer = LeaveRequestSerializer(data=data)
        assert serializer.is_valid(), serializer.errors

    def test_end_before_start(self):
        from modules.hrm.backend.api.v1.serializers import LeaveRequestSerializer
        data = {
            "employee_id": str(uuid4()),
            "leave_type": "ANNUAL",
            "start_date": "2024-06-10",
            "end_date": "2024-06-03",
            "days_count": 3,
        }
        serializer = LeaveRequestSerializer(data=data)
        assert not serializer.is_valid()


class TestBankAccountSerializer:
    """تست‌های سریالایزر حساب بانکی."""

    def test_valid_sheba(self):
        from modules.hrm.backend.api.v1.serializers import BankAccountSerializer
        data = {
            "employee_id": str(uuid4()),
            "bank_name": "بانک ملی",
            "account_number": "1234567890",
            "sheba_number": "IR012345678901234567890123",
            "is_primary": True,
        }
        serializer = BankAccountSerializer(data=data)
        assert serializer.is_valid(), serializer.errors

    def test_invalid_sheba_prefix(self):
        from modules.hrm.backend.api.v1.serializers import BankAccountSerializer
        data = {
            "employee_id": str(uuid4()),
            "bank_name": "بانک ملی",
            "account_number": "1234567890",
            "sheba_number": "US012345678901234567890123",
            "is_primary": True,
        }
        serializer = BankAccountSerializer(data=data)
        assert not serializer.is_valid()
        assert "sheba_number" in serializer.errors
