import 'package:flutter/material.dart';
import 'package:flutter_openim_sdk/flutter_openim_sdk.dart';
import 'package:get/get.dart';
import 'package:openim_common/openim_common.dart';

import '../../../company/brand/app_tokens.dart';
import '../../../company/ui/state_views.dart';
import 'friend_requests_logic.dart';

class FriendRequestsPage extends StatelessWidget {
  final logic = Get.find<FriendRequestsLogic>();

  FriendRequestsPage({super.key});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('新的同事')),
      backgroundColor: AppColors.pageBg,
      body: Obx(() {
        if (logic.loading.value) {
          return const CompanyLoadingView();
        }
        if (logic.loadFailed.value) {
          return CompanyFailView(onRetry: logic.retry);
        }
        if (logic.applicationList.isEmpty) {
          return const CompanyEmptyView(
            icon: Icons.person_outline,
            title: '暂无同事申请',
            subtitle: '发出或收到的申请会显示在这里',
          );
        }
        return ListView.builder(
          itemCount: logic.applicationList.length,
          itemBuilder: (_, index) =>
              _buildItemView(context, logic.applicationList[index]),
        );
      }),
    );
  }

  Widget _buildItemView(BuildContext context, FriendApplicationInfo info) {
    final isISendRequest = info.fromUserID == OpenIM.iMManager.userID;
    final name = isISendRequest ? info.toNickname : info.fromNickname;
    final faceURL = isISendRequest ? info.toFaceURL : info.fromFaceURL;
    final waiting = info.isWaitingHandle;
    final rejected = info.isRejected;
    final agreed = info.isAgreed;
    final narrow = MediaQuery.sizeOf(context).width < 360;
    final pendingActions = waiting && !isISendRequest;
    final stacked = narrow && pendingActions;

    Widget status;
    if (waiting && isISendRequest) {
      status = const Text('等待对方通过',
          style: TextStyle(
              fontSize: AppFont.sub, color: AppColors.textSecondary));
    } else if (pendingActions) {
      status = SizedBox(
        width: 132,
        child: Row(
          children: [
            Expanded(
              child: OutlinedButton(
                onPressed: () => logic.refuseFriendApplication(info),
                style: OutlinedButton.styleFrom(
                  minimumSize: const Size(0, 32),
                  padding: EdgeInsets.zero,
                  side: const BorderSide(
                      color: AppColors.textSecondary, width: 0.5),
                  foregroundColor: AppColors.textPrimary,
                  shape: RoundedRectangleBorder(
                      borderRadius:
                          BorderRadius.circular(AppRadius.control)),
                ),
                child: const Text('拒绝',
                    style: TextStyle(fontSize: AppFont.sub)),
              ),
            ),
            const SizedBox(width: AppGap.x2),
            Expanded(
              child: FilledButton(
                onPressed: () => logic.acceptFriendApplication(info),
                style: FilledButton.styleFrom(
                  minimumSize: const Size(0, 32),
                  padding: EdgeInsets.zero,
                  backgroundColor: AppColors.primary,
                  shape: RoundedRectangleBorder(
                      borderRadius:
                          BorderRadius.circular(AppRadius.control)),
                ),
                child: const Text('接受',
                    style: TextStyle(
                        fontSize: AppFont.sub, color: Colors.white)),
              ),
            ),
          ],
        ),
      );
    } else if (agreed) {
      status = const Text('已添加',
          style: TextStyle(
              fontSize: AppFont.sub, color: AppColors.textSecondary));
    } else if (rejected) {
      status = const Text('已拒绝',
          style: TextStyle(
              fontSize: AppFont.sub, color: AppColors.textSecondary));
    } else {
      status = const SizedBox.shrink();
    }

    final identity = Row(
      children: [
        AvatarView(url: faceURL, text: name, width: 48, height: 48),
        const SizedBox(width: AppGap.x3),
        Expanded(
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            mainAxisAlignment: MainAxisAlignment.center,
            children: [
              Text(
                name ?? '',
                maxLines: 1,
                overflow: TextOverflow.ellipsis,
                style: const TextStyle(
                    fontSize: AppFont.body, color: AppColors.textPrimary),
              ),
              if (IMUtils.isNotNullEmptyStr(info.reqMsg))
                Text(
                  info.reqMsg ?? '',
                  maxLines: 1,
                  overflow: TextOverflow.ellipsis,
                  style: const TextStyle(
                      fontSize: AppFont.sub, color: AppColors.textSecondary),
                ),
            ],
          ),
        ),
      ],
    );

    return Container(
      constraints: const BoxConstraints(minHeight: 72),
      padding: const EdgeInsets.symmetric(
          horizontal: AppGap.x4, vertical: AppGap.x3),
      decoration: const BoxDecoration(
        color: AppColors.pageBg,
        border:
            Border(bottom: BorderSide(color: AppColors.divider, width: 0.5)),
      ),
      child: stacked
          ? Column(
              crossAxisAlignment: CrossAxisAlignment.stretch,
              children: [
                identity,
                const SizedBox(height: AppGap.x2),
                Align(alignment: Alignment.centerRight, child: status),
              ],
            )
          : Row(
              children: [
                Expanded(child: identity),
                const SizedBox(width: AppGap.x2),
                status,
              ],
            ),
    );
  }
}
