import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:rogapp/routes/app_pages.dart';
import 'dart:io';

class PermissionHandlerScreen extends StatefulWidget {
  const PermissionHandlerScreen({Key? key}) : super(key: key);

  @override
  State<PermissionHandlerScreen> createState() =>
      _PermissionHandlerScreenState();
}

class _PermissionHandlerScreenState extends State<PermissionHandlerScreen> {
  @override
  void initState() {
    super.initState();
    WidgetsBinding.instance.addPostFrameCallback((_) {
      _checkPermissionStatus();
    });
  }

  _checkPermissionStatus() async {
    PermissionStatus status = await Permission.location.status;

    if (status.isGranted == false) {
      if (context.mounted) {
        showAlert(context);
      }
    } else if (status.isPermanentlyDenied) {
      await requestPermission();
    } else {
      if (mounted) {
        Get.toNamed(AppPages.LOGIN);
      }
    }
  }

  void showAlert(BuildContext context) {
    showDialog(
        context: context,
        builder: (_) => AlertDialog(
              title: const Text('ロケーション許可'),
              content: const SingleChildScrollView(
                child: ListBody(
                  children: <Widget>[
                    Text('ぎふナビ "アプリへようこそ！\n'),
                    Text('収集データ:\n'),
                    Text(
                        '岐阜ナビアプリをより快適にご利用いただくために、チェックポイントでの自動チェックインのための位置情報を収集しています。また、撮影した画像やチェックインした時間を収集し、チャレンジの勝者を決定します。\n'),
                    Text('お客様のデータの使用方法:\n'),
                    Text(
                        'お客様のデータは、アプリを改善し、競争力のある魅力的な体験を提供するのに役立ちます。お客様の位置情報と画像は、個人を特定できない統計データとして処理され、いかなる個人情報にもリンクされないようにしています\n'),
                    Text('お客様の管理:\n'),
                    Text(
                        'お客様はご自身のデータを完全に管理することができます。アプリの設定でいつでも同意を撤回することができます。位置情報の収集に同意しなくても、ぎふナビを楽しむことはできますが、自動チェックインや競技への参加など、一部の機能が制限されることを覚えておいてください。位置情報、画像、時刻情報の利用に同意する場合は「許可」を選択してください。許可しない場合は、「許可しない」を選択してください。あなたの選択は、アプリの他の機能を使用することに影響しません。\n'),
                  ],
                ),
              ),
              actions: <Widget>[
                ElevatedButton(
                  child: const Text('OK'),
                  onPressed: () {
                    Get.back();
                    requestPermission();
                  },
                ),
              ],
            ));
  }

  Future<void> requestPermission() async {
    PermissionStatus permission = await Permission.location.status;
    if (permission == PermissionStatus.permanentlyDenied) {
      showPermanentAlert();
    } else {
      PermissionStatus newPermission = await Permission.location.request();
      if (newPermission != PermissionStatus.granted) {
        exit(0);
      } else {
        if (context.mounted) {
          Get.toNamed(AppPages.LOGIN);
        }
      }
    }
  }

  @override
  Widget build(BuildContext context) {
    return const Scaffold(
      body: Text(""),
    );
  }

  void showPermanentAlert() {
    showDialog(
        context: context,
        builder: (_) => AlertDialog(
              title: const Text('無効'),
              content: const SingleChildScrollView(
                child: ListBody(
                  children: <Widget>[
                    Text('位置情報が無効になっています'),
                    Text(
                        'このアプリケーションへの位置情報アクセスが無効になっています。続行するには設定>プライバシーとセキュリティ>位置情報サービス>岐阜ナビ で有効にしてください。'),
                  ],
                ),
              ),
              actions: <Widget>[
                ElevatedButton(
                  child: const Text('OK'),
                  onPressed: () async {
                    await openAppSettings().then(
                      (value) async {
                        if (value) {
                          if (await Permission
                                      .location.status.isPermanentlyDenied ==
                                  true &&
                              await Permission.location.status.isGranted ==
                                  false) {
                            requestPermission(); /* opens app settings until permission is granted */
                          }
                        }
                      },
                    );
                  },
                ),
              ],
            ));
  }
}
