import 'package:networks_sdk/networks_sdk.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';

import 'package:im_app/app/di/app_providers.dart';
import 'package:im_app/features/login/di/auth_providers.dart';
import 'package:im_app/features/login/presentation/login_state.dart';

part 'login_view_model.g.dart';

/// 登录 ViewModel（@riverpod 自动生成 `loginViewModelProvider`）
///
/// 管理两步登录流程：手机号 → 验证码 → 完成登录。
///
/// ```dart
/// // View 层读取状态
/// final state = ref.watch(loginViewModelProvider);
///
/// // View 层调用方法
/// ref.read(loginViewModelProvider.notifier).sendOtp('+86', '13800138000');
/// ref.read(loginViewModelProvider.notifier).verifyAndLogin('123456');
/// ```
///
/// ## DI 链路
///
/// ```
/// loginViewModelProvider                    ← @riverpod 自动生成
///   → ref.read(loginUseCaseProvider)       ← di/ 手动装配
///     → ref.read(authRepositoryProvider)   ← di/ 手动装配
///       → ref.read(networkSdkApiProvider)  ← app/di/ 手动装配
/// ```
@riverpod
class LoginViewModel extends _$LoginViewModel {
  @override
  LoginState build() => const LoginState();

  /// 步骤 1：发送手机验证码
  ///
  /// 成功后 step 切换为 [LoginStep.otp]，手机号保存到 state 供步骤 2 使用。
  Future<void> sendOtp(String countryCode, String contact) async {
    if (state.isLoading) return;
    state = state.copyWith(isLoading: true, error: null);

    try {
      await ref
          .read(loginUseCaseProvider)
          .sendOtp(countryCode: countryCode, contact: contact);

      if (!ref.mounted) return;
      state = state.copyWith(
        step: LoginStep.otp,
        countryCode: countryCode,
        contact: contact,
        isLoading: false,
      );
    } on FormatException catch (e) {
      if (!ref.mounted) return;
      state = state.copyWith(error: e.message, isLoading: false);
    } on ApiError catch (e) {
      if (!ref.mounted) return;
      state = state.copyWith(error: e.displayMessage, isLoading: false);
    } catch (e) {
      if (!ref.mounted) return;
      state = state.copyWith(error: e.toString(), isLoading: false);
    }
  }

  /// 步骤 2+3：校验验证码并完成登录
  ///
  /// 成功后调用 [AuthNotifier.login] 触发路由守卫重定向，provider 随即被 dispose。
  Future<void> verifyAndLogin(String code) async {
    if (state.isLoading) return;
    state = state.copyWith(isLoading: true, error: null);

    try {
      await ref.read(loginUseCaseProvider).verifyAndLogin(
        countryCode: state.countryCode,
        contact: state.contact,
        code: code,
      );

      // 成功后触发路由守卫重定向。
      // 注意：login() 触发导航后 provider 随即被 dispose，之后不能再写 state。
      if (!ref.mounted) return;
      ref.read(authNotifierProvider).login();
    } on FormatException catch (e) {
      if (!ref.mounted) return;
      state = state.copyWith(error: e.message, isLoading: false);
    } on ApiError catch (e) {
      if (!ref.mounted) return;
      state = state.copyWith(error: e.displayMessage, isLoading: false);
    } catch (e) {
      if (!ref.mounted) return;
      state = state.copyWith(error: e.toString(), isLoading: false);
    }
  }

  /// 返回手机号输入步骤（用户想修改手机号）
  void backToPhone() {
    state = state.copyWith(step: LoginStep.phone, error: null);
  }
}
