import 'package:equatable/equatable.dart'; import '../../../core/api/api_failure.dart'; import '../../../core/payments/country_codes.dart'; import '../../../core/session/app_user.dart'; import 'phone_error.dart'; /// خطوات الدخول بالترتيب الميداني المثبت في سيرو (docs/39 §2): بوابتان /// كاملتان **قبل** أي حقل إدخال، ثم الهاتف فالرمز. enum LoginStep { agreement, permission, phone, otp, done } enum LoginStatus { idle, submitting, failure, success } class LoginState extends Equatable { const LoginState({ this.step = LoginStep.agreement, this.status = LoginStatus.idle, this.phone = '', this.country = CountryCode.jordan, this.agreed = false, this.failure, this.phoneError, this.resendIn = 0, this.permissionPermanentlyDenied = false, this.user, }); final LoginStep step; final LoginStatus status; /// الرقم كما أدخله المستخدم — الخادم يطبّعه، فلا نطبّعه نحن (docs/38 §2). final String phone; /// الدولة المختارة — تحدّد المفتاح الدولي وطول التحقّق. تُبدأ من /// `countryPack` المستأجر لا من لغة الجهاز. final CountryCode country; /// ما يُرسل للخادم: المفتاح + الرقم بلا `+` (`962790000001`). String get e164 => '${country.dial}${phone.trim()}'; final bool agreed; final ApiFailure? failure; final PhoneError? phoneError; /// ثوانٍ متبقّية قبل السماح بإعادة الإرسال. الخادم يحدّ بثلاثة طلبات كل /// خمس دقائق، فالعدّاد ليس تجميلاً (docs/39 §2). final int resendIn; /// رُفض الإذن نهائياً — الحل الوحيد فتح إعدادات النظام. final bool permissionPermanentlyDenied; final AppUser? user; bool get isSubmitting => status == LoginStatus.submitting; bool get canResend => resendIn == 0 && !isSubmitting; LoginState copyWith({ LoginStep? step, LoginStatus? status, String? phone, CountryCode? country, bool? agreed, ApiFailure? failure, PhoneError? phoneError, int? resendIn, bool? permissionPermanentlyDenied, AppUser? user, bool clearFailure = false, bool clearPhoneError = false, }) { return LoginState( step: step ?? this.step, status: status ?? this.status, phone: phone ?? this.phone, country: country ?? this.country, agreed: agreed ?? this.agreed, failure: clearFailure ? null : (failure ?? this.failure), phoneError: clearPhoneError ? null : (phoneError ?? this.phoneError), resendIn: resendIn ?? this.resendIn, permissionPermanentlyDenied: permissionPermanentlyDenied ?? this.permissionPermanentlyDenied, user: user ?? this.user, ); } @override List get props => [ step, status, phone, country, agreed, failure, phoneError, resendIn, permissionPermanentlyDenied, user, ]; }