import 'dart:convert';
import 'dart:typed_data';

import 'package:flutter/material.dart';
import 'package:flutter_habit/common/LocalData.dart';
import 'package:flutter_habit/pages/home_page.dart';

class UserProvider extends ChangeNotifier {
  String? token;

  int? uid;
  String? email;
  String? userName;
  String? gender;
  String? birthday;
  Uint8List? photo;
  int? coins;

  void init() {
    load();
    debugPrint("""init AccountProvider to:
      token = $token
      uid = $uid
      email = $email
      userName = $userName
      gender = $gender
      birthday = $birthday
      photo = ${photo != null ? "notNull" : "null"}
      coins = $coins""");
  }

  void store() {
    LocalData.getInstance()!.setString("token", token!);
    LocalData.getInstance()!.setInt("uid", uid!);
    LocalData.getInstance()!.setString("email", email!);
    LocalData.getInstance()!.setString("userName", userName!);
    LocalData.getInstance()!.setString("gender", gender!);
    LocalData.getInstance()!.setString("birthday", birthday!);
    LocalData.getInstance()!.setString(
        "photo", photo == null ? null : Base64Encoder().convert(photo!));
    LocalData.getInstance()!.setInt("coins", coins!);
  }

  void load() {
    token = LocalData.getInstance()!.getString("token");
    uid = LocalData.getInstance()!.getInt("uid");
    email = LocalData.getInstance()!.getString("email");
    userName = LocalData.getInstance()!.getString("userName");
    gender = LocalData.getInstance()!.getString("gender");
    birthday = LocalData.getInstance()!.getString("birthday");
    String? listString = LocalData.getInstance()!.getString("photo");
    if (listString == null) {
      photo = null;
    } else {
      photo = Base64Decoder().convert(listString);
    }
    coins = LocalData.getInstance()!.getInt("coins");
  }

  Future<void> cleanDataAndBackToHome(BuildContext context) async {
    token = null;

    uid = null;
//    email = null;
    userName = null;
    gender = null;
    birthday = null;
    photo = null;
    coins = null;
    store();
    await Navigator.of(context).pushAndRemoveUntil(
      MaterialPageRoute(builder: (context) => HomePage()),
      (route) => route == null,
    );
    refresh();
  }

  void refresh() {
    store();
    notifyListeners();
  }
}