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

import 'package:flutter/material.dart';
import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:shared_preferences/shared_preferences.dart';

import '../app/constant.dart';
import '../app/route.dart';
import '../provider/current_menu_provider.dart';
import '../provider/current_user_provider.dart';
import '../screen/login/logout_provider.dart';

class CustomDrawer extends HookConsumerWidget {
  // final String userCompany;
  const CustomDrawer({
    Key? key,
    // required this.userCompany,
  }) : super(key: key);

  @override
  Widget build(BuildContext context, WidgetRef ref) {
    final selectedUser = ref.read(currentUserProvider);
    final isLoading = useState(false);
    final errorMessage = useState("");
    final successMessage = useState("");
    final M_CompanyName = useState("-");

    Future<String> getCompanyName() async {
      final shared = await SharedPreferences.getInstance();
      String M_CompanyName = "-";

      if (shared != null) {
        final bearerString = shared.get(Constant.bearerName).toString();
        final xmodel = jsonDecode(bearerString);
        if (xmodel != null) {
          M_CompanyName = xmodel["model"]["M_CompanyName"];
        }
      }

      if (M_CompanyName == "0") {
        // throw BaseRepositoryException(message: 'Invalid Company ID');
      }

      return M_CompanyName;
    }

    useEffect(() {
      WidgetsBinding.instance.addPostFrameCallback((timeStamp) async {
        final userID = ref.read(currentUserProvider)?.model.M_UserID ?? "0";
        if (userID == "0") {
          //not login
          Navigator.of(context)
              .pushNamedAndRemoveUntil(loginRoute, (route) => true);

          //  Navigator.popAndPushNamed(context, loginRoute);
          return;
        }
        M_CompanyName.value = await getCompanyName();
      });
      return () {};
    }, []);

    ref.listen(logoutProvider, (prev, next) async {
      if (next is LogoutStateLoading) {
        isLoading.value = true;
      } else if (next is LogoutStateError) {
        isLoading.value = false;
        errorMessage.value = next.message;
        Timer(const Duration(seconds: 3), () {
          errorMessage.value = "";
        });
      } else if (next is LogoutStateDone) {
        isLoading.value = false;
        final shared = await SharedPreferences.getInstance();
        final bearerString = shared.get(Constant.bearerName).toString();
        // print(bearerString);
        if (bearerString.isNotEmpty) {
          shared.remove(bearerString);
          shared.clear();
          // Navigator.popAndPushNamed(context, loginRoute);
          Navigator.of(context)
              .pushNamedAndRemoveUntil(loginRoute, (route) => false);
        }
        Timer(const Duration(seconds: 3), () async {
          successMessage.value = "";
        });
      }
    });

    final currentMenu = ref.read(currentPageProvider);

    return Container(
      width: Constant.getActualXPhone(context: context, x: 300),
      height: Constant.getActualYPhone(context: context, y: 844),
      child: Drawer(
        elevation: 0,
        shape: RoundedRectangleBorder(
            borderRadius: BorderRadius.all(Radius.circular(0))),
        child: Column(
          children: [
            Expanded(
              child: ListView(
                children: [
                  Container(
                    child: Image(
                        image:
                            AssetImage('images/logo_sismedika_landscape.png')),
                  ),

                  SizedBox(
                    height: Constant.getActualYPhone(context: context, y: 8),
                  ),

                  Padding(
                    padding: EdgeInsets.only(
                      top: Constant.getActualYPhone(context: context, y: 10),
                      bottom: Constant.getActualYPhone(context: context, y: 10),
                      right: Constant.getActualXPhone(context: context, x: 24),
                      left: Constant.getActualXPhone(context: context, x: 24),
                    ),
                    child: Container(
                      width: Constant.getActualXPhone(context: context, x: 300),
                    ),
                  ),

                  //   child: Padding(
                  //     padding: EdgeInsets.only(
                  //       left: Constant.getActualXPhone(context: context, x: 24),
                  //       right: Constant.getActualXPhone(context: context, x: 71),
                  //     ),
                  //     child: Container(
                  //       decoration: BoxDecoration(
                  //         borderRadius: BorderRadius.circular(6),
                  //         color: Constant.textGrey.withOpacity(0.16),
                  //       ),
                  //       child: Padding(
                  //         padding: EdgeInsets.only(
                  //           left: Constant.getActualXPhone(context: context, x: 8),
                  //           right: Constant.getActualXPhone(context: context, x: 8),
                  //         ),
                  //         child: Text(
                  //           M_CompanyName.value,
                  //           style: Constant.body3(context: context).copyWith(
                  //             fontWeight: FontWeight.w700,
                  //             color: Constant.textGreyv2,
                  //             backgroundColor: Constant.textGrey.withOpacity(0.16),
                  //           ),
                  //         ),
                  //       ),
                  //     ),
                  //   ),
                  // ),
                  Chip(
                    backgroundColor: Constant.textGrey.withOpacity(0.16),
                    label: Text(
                      M_CompanyName.value,
                      overflow: TextOverflow.ellipsis,
                      style: TextStyle(
                        color: Constant.textGreyv2,
                      ),
                    ),
                  ),

                  ListTile(
                    leading: Icon(
                      Icons.home,
                      color: (currentMenu == 0)
                          ? Constant.pcBtnBackgroundColor
                          : Constant.textGreyv2,
                    ),
                    title: Text(
                      'Home',
                      style: TextStyle(
                        color: (currentMenu == 0)
                            ? Constant.pcBtnBackgroundColor
                            : Constant.textGreyv2,
                      ),
                    ),
                    onTap: () {
                      // Handle navigation to Home screen
                      Navigator.pop(context);
                      ref.read(currentPageProvider.state).update((state) => 0);
                      Navigator.pushNamed(context, homeRoute);
                    },
                  ),
                  ListTile(
                    leading: Icon(
                      Icons.money,
                      color: (currentMenu == 1)
                          ? Constant.pcBtnBackgroundColor
                          : Constant.textGreyv2,
                    ),
                    title: Text(
                      'Transaksi',
                      style: TextStyle(
                        color: (currentMenu == 1)
                            ? Constant.pcBtnBackgroundColor
                            : Constant.textGreyv2,
                      ),
                    ),
                    onTap: () {
                      // Handle navigation to Transaksi screen
                      Navigator.pop(context);
                      ref.read(currentPageProvider.state).update((state) => 1);
                      Navigator.pushNamed(context, transaksiRoute);
                    },
                  ),
                  ListTile(
                    leading: Icon(
                      Icons.history,
                      color: (currentMenu == 2)
                          ? Constant.pcBtnBackgroundColor
                          : Constant.textGreyv2,
                    ),
                    title: Text(
                      'History Transaksi',
                      style: TextStyle(
                        color: (currentMenu == 2)
                            ? Constant.pcBtnBackgroundColor
                            : Constant.textGreyv2,
                      ),
                    ),
                    onTap: () {
                      // Handle navigation to User screen
                      Navigator.pop(context);
                      ref.read(currentPageProvider.state).update((state) => 2);
                      Navigator.pushNamed(context, historyTransaksiRoute);
                    },
                  ),
                  ListTile(
                    leading: Icon(
                      Icons.feed,
                      color: (currentMenu == 3)
                          ? Constant.pcBtnBackgroundColor
                          : Constant.textGreyv2,
                    ),
                    title: Text(
                      'Report',
                      style: TextStyle(
                        color: (currentMenu == 3)
                            ? Constant.pcBtnBackgroundColor
                            : Constant.textGreyv2,
                      ),
                    ),
                    onTap: () {
                      // Handle navigation to Transaksi screen
                      Navigator.pop(context);
                      ref.read(currentPageProvider.state).update((state) => 3);
                      Navigator.pushNamed(context, reportRoute);
                    },
                  ),
                   ListTile(
                    leading: Icon(
                      Icons.account_balance,
                      color: (currentMenu == 4)
                          ? Constant.pcBtnBackgroundColor
                          : Constant.textGreyv2,
                    ),
                    title: Text(
                      'Change Company',
                      style: TextStyle(
                        color: (currentMenu == 4)
                            ? Constant.pcBtnBackgroundColor
                            : Constant.textGreyv2,
                      ),
                    ),
                    onTap: () {
                      // Handle navigation to Transaksi screen
                      Navigator.pop(context);
                      ref.read(currentPageProvider.state).update((state) => 4);
                      Navigator.pushNamed(context, changeCompanyRoute);
                    },
                  ),
                   ListTile(
                    leading: Icon(
                      Icons.lock_reset,
                      color: (currentMenu == 5)
                          ? Constant.pcBtnBackgroundColor
                          : Constant.textGreyv2,
                    ),
                    title: Text(
                      'Change Password',
                      style: TextStyle(
                        color: (currentMenu == 5)
                            ? Constant.pcBtnBackgroundColor
                            : Constant.textGreyv2,
                      ),
                    ),
                    onTap: () {
                      // Handle navigation to Transaksi screen
                      Navigator.pop(context);
                      ref.read(currentPageProvider.state).update((state) => 5);
                      Navigator.pushNamed(context, changePasswordRoute);
                    },
                  ),
                  ListTile(
                    leading: Icon(
                      Icons.logout,
                      color: Constant.textGreyv2,
                    ),
                    title: Text(
                      'Logout',
                      style: TextStyle(color: Constant.textGreyv2),
                    ),
                    onTap: () {
                      // di set ke 0 lagi
                      ref.read(currentPageProvider.state).update((state) => 0);
                      ref.read(logoutProvider.notifier).logout(
                            M_UserID: selectedUser?.model.M_UserID ?? "",
                            M_UserUsername:
                                selectedUser?.model.M_UserUsername ?? "",
                          );
                    },
                  ),
                ],
              ),
            ),
            // Versi Aplikasi
            Padding(
              padding: EdgeInsets.only(
                right: Constant.getActualXPhone(context: context, x: 20),
                bottom: Constant.getActualYPhone(context: context, y: 10),
              ),
              child: Align(
                alignment: Alignment.bottomRight,
                child: Text(
                  'Versi ${Constant.version}',
                  style: Constant.titleH4Login(context: context)
                      .copyWith(color: Constant.textGrey),
                ),
              ),
            ),
          ],
        ),
      ),
    );
  }
}
