import 'package:comwell_key_app/authentication/authentication_repository.dart';
import 'package:comwell_key_app/base/base_cubit.dart';
import 'package:comwell_key_app/domain/models/user.dart';
import 'package:comwell_key_app/domain/repositories/profile_repository.dart';
import 'package:firebase_analytics/firebase_analytics.dart';
import 'package:flutter/material.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:package_info_plus/package_info_plus.dart';
import '../../../domain/models/app_error.dart';

part '../../../.generated/presentation/app/bloc/profile_cubit.freezed.dart';

class ProfileCubit extends BaseCubit<ProfileState> {
  final ProfileRepository _profileRepository;
  final AuthenticationRepository _authenticationRepository;

  ProfileCubit(
    this._profileRepository,
    this._authenticationRepository,
  ) : super(const ProfileState()) {
    init();
  }

  void sendPageViewEvent() async {
    await FirebaseAnalytics.instance.logScreenView(
      screenName: 'Profile',
      screenClass: '/profile',
    );
  }

  Future<String> getVersion() async {
    final packageInfo = await PackageInfo.fromPlatform();
    return packageInfo.version;
  }

  void logOutPressed() {
    _authenticationRepository.logOut();
    safeEmit(const ProfileState());
  }

  void init() async {
    try {
      safeEmit(state.loading());
      final user = await _profileRepository.fetchProfileSettings(fetchRemote: true);
      sendPageViewEvent();
      safeEmit(state.copyWith(user: user));
    } catch (e, st) {
      logError(e, st);
      safeEmit(state.copyWith(error: AppError.unknown(e.toString())));
    } finally {
      safeEmit(state.copyWith(isLoading: false));
    }
  }

  void onToSClick(bool? value) async {
    safeEmit(state.copyWith(isToSAccepted: value!));
  }

  void onNewsletterClick(bool? value) async {
    safeEmit(state.copyWith(isNewsletterAccepted: value!));
  }

  String getGender(String gender) {
    switch (gender) {
      case 'Male':
        return 'M';
      case 'Female':
        return 'F';
      default:
        return 'O';
    }
  }

  void updateUser(User user) {
    safeEmit(state.copyWith(user: user));
  }

  Future<bool> onComwellClubSignupClick(User user, BuildContext context) async {
    try {
      if (!state.isToSAccepted) return false;
      safeEmit(state.loading());
      User updatedUser = await _profileRepository.signupForComwellClub(user);
      safeEmit(state.copyWith(user: updatedUser));
      return true;
    } catch (e, st) {
      logError(e, st);
      safeEmit(state.copyWith(error: AppError.unknown(e.toString())));
      return false;
    } finally {
      safeEmit(state.copyWith(isLoading: false));
    }
  }
}

@freezed
abstract class ProfileState with _$ProfileState {
  const factory ProfileState({
    @Default(false) bool isLoading,
    @Default(AppError.none) AppError error,
    @Default(User()) User user,
    @Default(false) bool isToSAccepted,
    @Default(false) bool isNewsletterAccepted,
  }) = _ProfileState;

  const ProfileState._();

  ProfileState loading() => copyWith(isLoading: true, error: AppError.none);
}