// ignore_for_file: use_build_context_synchronously

import 'dart:async';
import 'dart:convert';

import 'package:flutter/widgets.dart';
import '../../devices/device_model.dart';
import '../../../product/base/bloc/base_bloc.dart';
import '../../../product/services/api_services.dart';
import '../../../product/services/language_services.dart';
import '../../../product/utils/response_status_utils.dart';

import 'group_detail_model.dart';

class DetailGroupBloc extends BlocBase {
  APIServices apiServices = APIServices();
  final detailGroup = StreamController<GroupDetail>.broadcast();
  StreamSink<GroupDetail> get sinkDetailGroup => detailGroup.sink;
  Stream<GroupDetail> get streamDetailGroup => detailGroup.stream;

  final warningDevice = StreamController<List<DeviceOfGroup>>.broadcast();
  StreamSink<List<DeviceOfGroup>> get sinkWarningDevice => warningDevice.sink;
  Stream<List<DeviceOfGroup>> get streamWarningDevice => warningDevice.stream;

  final message = StreamController<String>.broadcast();
  StreamSink<String> get sinkMessage => message.sink;
  Stream<String> get streamMessage => message.stream;

  @override
  void dispose() {}

  Future<void> getGroupDetail(String groupID) async {
    final body = await apiServices.getGroupDetail(groupID);
    final data = jsonDecode(body);
    List<DeviceOfGroup> warningDevices = [];
    if (data != null) {
      GroupDetail group = GroupDetail.fromJson(data);
      sinkDetailGroup.add(group);
      if (group.devices != null) {
        for (var device in group.devices!) {
          if (device.state == 1) {
            warningDevices.add(device);
          }
        }
        sinkWarningDevice.add(warningDevices);
      }
    }
  }

  Future<void> approveUserToGroup(BuildContext context, String groupID,
      String userID, String userName) async {
    Map<String, dynamic> body = {"group_id": groupID, "user_id": userID};
    int statusCode = await apiServices.approveGroup(body);
    showSnackBarResponseByStatusCode(context, statusCode,
        "Đã duyệt $userName vào nhóm!", "Duyệt $userName thất bại!");
  }

  Future<void> deleteOrUnapproveUser(BuildContext context, String groupID,
      String userID, String userName) async {
    int statusCode = await apiServices.deleteUserInGroup(groupID, userID);
    showSnackBarResponseByStatusCode(context, statusCode,
        "Đã xóa người dùng $userName", "Xóa người dùng $userName thất bại");
  }

  Future<void> deleteDevice(BuildContext context, String groupID,
      String thingID, String deviceName) async {
    int statusCode = await apiServices.deleteDeviceInGroup(groupID, thingID);
    showSnackBarResponseByStatusCode(context, statusCode,
        "Đã xóa thiết bị $deviceName", "Xóa thiết bị $deviceName thất bại");
  }

  Future<void> leaveGroup(
      BuildContext context, String groupID, String userID) async {
    int statusCode = await apiServices.deleteUserInGroup(groupID, userID);
    showSnackBarResponseByStatusCode(
        context,
        statusCode,
        appLocalization(context).notification_leave_group_success,
        appLocalization(context).notification_leave_group_failed);
  }

  Future<void> updateDeviceNameInGroup(
      BuildContext context, String thingID, String newAlias) async {
    Map<String, dynamic> body = {"thing_id": thingID, "alias": newAlias};
    int statusCode = await apiServices.updateDeviceAlias(body);
    showSnackBarResponseByStatusCode(
      context,
      statusCode,
      appLocalization(context).notification_update_device_success,
      appLocalization(context).notification_update_device_failed,
    );
  }

  Future<List<Device>> getOwnerDevices() async {
    List<Device> allDevices = [];
    String body = await apiServices.getOwnerDevices();
    if (body != "") {
      final data = jsonDecode(body);
      List<dynamic> items = data['items'];
      allDevices = Device.fromJsonDynamicList(items);
    }
    return allDevices;
  }

  Future<void> addDeviceToGroup(
      BuildContext context, String groupID, String thingID) async {
    Map<String, dynamic> body = {
      "thing_id": thingID,
    };
    int statusCode = await apiServices.addDeviceToGroup(groupID, body);
    showSnackBarResponseByStatusCode(
      context,
      statusCode,
      appLocalization(context).notification_add_device_success,
      appLocalization(context).notification_add_device_failed,
    );
  }
}
