import 'package:PiliPlus/utils/storage.dart';
import 'package:PiliPlus/utils/storage_key.dart';
import 'package:PiliPlus/utils/storage_pref.dart';
import 'package:flutter/material.dart';
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:get/get.dart';

class SetSwitchItem extends StatefulWidget {
  final String? title;
  final String? subtitle;
  final String? setKey;
  final bool? defaultVal;
  final ValueChanged<bool>? onChanged;
  final bool? needReboot;
  final Widget? leading;
  final Function? onTap;
  final EdgeInsetsGeometry? contentPadding;
  final TextStyle? titleStyle;

  const SetSwitchItem({
    this.title,
    this.subtitle,
    this.setKey,
    this.defaultVal,
    this.onChanged,
    this.needReboot,
    this.leading,
    this.onTap,
    this.contentPadding,
    this.titleStyle,
    super.key,
  });

  @override
  State<SetSwitchItem> createState() => _SetSwitchItemState();
}

class _SetSwitchItemState extends State<SetSwitchItem> {
  late bool val;

  void setVal() {
    if (widget.setKey == SettingBoxKey.appFontWeight) {
      val = Pref.appFontWeight != -1;
    } else {
      val = GStorage.setting
          .get(widget.setKey, defaultValue: widget.defaultVal ?? false);
    }
  }

  @override
  void didUpdateWidget(SetSwitchItem oldWidget) {
    super.didUpdateWidget(oldWidget);
    if (oldWidget.setKey != widget.setKey) {
      setVal();
    }
  }

  @override
  void initState() {
    super.initState();
    setVal();
  }

  Future<void> switchChange(ThemeData theme, value) async {
    if (widget.setKey == SettingBoxKey.badCertificateCallback &&
        (value ?? !val)) {
      showDialog(
        context: context,
        builder: (context) => AlertDialog(
          title: const Text('确定禁用 SSL 证书验证？'),
          content: const Text('禁用容易受到中间人攻击'),
          actions: [
            TextButton(
              onPressed: Get.back,
              child: Text(
                '取消',
                style: TextStyle(
                  color: theme.colorScheme.outline,
                ),
              ),
            ),
            TextButton(
              onPressed: () async {
                Get.back();
                await GStorage.setting
                    .put(SettingBoxKey.badCertificateCallback, true);
                val = true;
                SmartDialog.showToast('重启生效');
                setState(() {});
              },
              child: const Text('确认'),
            ),
          ],
        ),
      );
      return;
    }

    val = value ?? !val;

    if (widget.setKey == SettingBoxKey.appFontWeight) {
      await GStorage.setting.put(SettingBoxKey.appFontWeight, val ? 4 : -1);
    } else {
      await GStorage.setting.put(widget.setKey, val);
    }

    widget.onChanged?.call(val);
    if (widget.needReboot == true) {
      SmartDialog.showToast('重启生效');
    }
    setState(() {});
  }

  @override
  Widget build(BuildContext context) {
    final theme = Theme.of(context);
    TextStyle titleStyle = widget.titleStyle ??
        theme.textTheme.titleMedium!.copyWith(
          color:
              widget.onTap != null && !val ? theme.colorScheme.outline : null,
        );
    TextStyle subTitleStyle =
        theme.textTheme.labelMedium!.copyWith(color: theme.colorScheme.outline);
    return ListTile(
      contentPadding: widget.contentPadding,
      enabled: widget.onTap != null ? val : true,
      onTap: () => widget.onTap != null
          ? widget.onTap?.call()
          : switchChange(theme, null),
      title: Text(widget.title!, style: titleStyle),
      subtitle: widget.subtitle != null
          ? Text(widget.subtitle!, style: subTitleStyle)
          : null,
      leading: widget.leading,
      trailing: Transform.scale(
        alignment: Alignment.centerRight,
        scale: 0.8,
        child: Switch(
          thumbIcon:
              WidgetStateProperty.resolveWith<Icon?>((Set<WidgetState> states) {
            if (states.isNotEmpty && states.first == WidgetState.selected) {
              return const Icon(Icons.done);
            }
            return null;
          }),
          value: val,
          onChanged: (value) => switchChange(theme, value),
        ),
      ),
    );
  }
}
