import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:http/http.dart' as http;

import 'dart:convert';
import 'dart:io';

//import 'MyHomePage.dart';
import 'pages/ListItemMenu.dart';

import 'classes/alert.dart';

import 'variable/globals.dart' as globals;
import 'package:permission_handler/permission_handler.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: LoginDemo(),
    );
  }
}

class LoginDemo extends StatefulWidget {
  @override
  _LoginDemoState createState() => _LoginDemoState();
}

class _LoginDemoState extends State<LoginDemo> with ShowErrorDialog {
  TextEditingController inputPseudo = TextEditingController();
  TextEditingController inputPassword = TextEditingController();
  Future<void> _login(BuildContext context) async {
    var url = Uri.parse("${globals.api}/token");
    var pseudo = inputPseudo.text;
    var password = inputPassword.text;
    print("get login");
    print(pseudo.isNotEmpty);
    print(password.isNotEmpty);
    if ((pseudo.isNotEmpty) && (password.isNotEmpty)) {
      print(url);
      try {
        //String credentials = "${pseudo}:${password}";
        //Codec<String, String> stringToBase64 = utf8.fuse(base64);
        //String encoded = stringToBase64.encode(credentials);
        var response = await http.post(url,
            // headers: {
            //  HttpHeaders.authorizationHeader: 'Basic $encoded',
            //}
            headers: {
              'accept': 'application/json',
              'Content-Type': 'application/x-www-form-urlencoded',
            },
            body: {
              "username": "${pseudo}",
              "password": "${password}"
            });
        print(response.statusCode);
        if ((response.statusCode == 200) || (response.statusCode == 201)) {
          SharedPreferences prefs = await SharedPreferences.getInstance();

          var cookies = response.headers["set-cookie"].toString().split(";");
          for (var cookie in cookies) {
            var cookiesMany = cookie.split(",");
            for (var cookie2 in cookiesMany) {
              switch (cookie2.split("=")[0]) {
                case "access_token":
                  {
                    prefs.setString("access_token", cookie2.split("=")[1]);
                  }
                  break;
                default:
                  break;
              }
            }
          }
          Navigator.push(
              context, MaterialPageRoute(builder: (_) => ListItemMenu()));
        } else {
          var text = "";
          switch (response.statusCode) {
            case 400:
              {
                text = "RequĂȘte mal construite";
              }
              break;
            case 406:
              {
                text = "Mot de passe incorrect";
              }
              break;
            case 404:
              {
                text = "Utilisateur inconnu";
              }
              break;
            case 403:
              {
                text = "Utilisateur desactive";
              }
              break;
            case 410:
              {
                text = "Token invalide";
              }
              break;
            case 500:
              {
                text = "Probleme interne du serveur";
              }
              break;
            default:
              {
                text = "Probleme d'authentification inconnu";
              }
              break;
          }
          showErrorDialog(context, text);
        }
      } catch (e) {
        showErrorDialog(context, "${e}");
      }
    } else {
      showErrorDialog(context, "Champ vide");
    }
  }

  void start() async {
    SharedPreferences prefs = await SharedPreferences.getInstance();
    var access_token = prefs.getString("access_token") ?? "";
    print("Get access token");

    if (access_token.isNotEmpty) {
      print("Appel HTTP");
      var urlToken = Uri.parse("${globals.api}/token");

      var responseToken = await http.get(urlToken,
          headers: {HttpHeaders.cookieHeader: 'access_token: ${access_token}'});
      print(responseToken.statusCode);
      if (responseToken.statusCode == 200) {
        print("route to item list");
        Navigator.push(
            context, MaterialPageRoute(builder: (_) => ListItemMenu()));
      } else {
        prefs.remove("access_token");
      }
    }
  }

  @override
  void initState() {
    _checkLocationPermission();
    start();
    super.initState();
  }

  Future<void> _checkLocationPermission() async {
    PermissionStatus status = await Permission.location.status;

    if (status.isGranted) {
      print("Location permission granted");
    } else if (status.isDenied) {
      print("Location permission denied");
      _requestLocationPermission();
    } else if (status.isPermanentlyDenied) {
      print("Location permission permanently denied");
      openAppSettings();
    }
  }

  // Request location permission
  Future<void> _requestLocationPermission() async {
    PermissionStatus status = await Permission.location.request();

    if (status.isGranted) {
      print("Location permission granted");
    } else if (status.isDenied) {
      print("Location permission denied");
    } else if (status.isPermanentlyDenied) {
      print("Location permission permanently denied");
      openAppSettings();
    }
  }

  // Open app settings to allow user to grant permission manually
  Future<void> _openAppSettings() async {
    bool opened = await openAppSettings();
    if (opened) {
      print("App settings opened");
    } else {
      print("Failed to open app settings");
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.white,
      appBar: AppBar(
        title: Text("Login Page"),
        backgroundColor: Colors.blue,
        foregroundColor: Colors.white,
      ),
      body: SingleChildScrollView(
        child: Column(
          children: <Widget>[
            Padding(
              padding: const EdgeInsets.only(top: 60.0),
              child: Center(
                child: Container(
                    width: 200,
                    height: 150,
                    decoration: BoxDecoration(
                        color: Colors.red,
                        borderRadius: BorderRadius.circular(50.0)),
                    child: Image.asset('./images/flutter.png')),
              ),
            ),
            Padding(
              //padding: const EdgeInsets.only(left:15.0,right: 15.0,top:0,bottom: 0),
              padding: EdgeInsets.symmetric(horizontal: 15),
              child: TextField(
                controller: inputPseudo,
                decoration: InputDecoration(
                    border: OutlineInputBorder(),
                    labelText: 'Pseudo',
                    hintText: 'Enter pseudo existent'),
              ),
            ),
            Padding(
              padding: const EdgeInsets.only(
                  left: 15.0, right: 15.0, top: 15, bottom: 0),
              //padding: EdgeInsets.symmetric(horizontal: 15),
              child: TextField(
                controller: inputPassword,
                obscureText: true,
                decoration: InputDecoration(
                    border: OutlineInputBorder(),
                    labelText: 'Password',
                    hintText: 'Enter secure password'),
              ),
            ),
            TextButton(
              onPressed: () {
                //TODO FORGOT PASSWORD SCREEN GOES HERE
              },
              child: Text(
                'Forgot Password',
                style: TextStyle(color: Colors.blue, fontSize: 15),
              ),
            ),
            Container(
              height: 50,
              width: 250,
              decoration: BoxDecoration(
                  color: Colors.blue, borderRadius: BorderRadius.circular(20)),
              child: TextButton(
                onPressed: () {
                  _login(context);
                },
                child: Text(
                  'Login',
                  style: TextStyle(color: Colors.white, fontSize: 25),
                ),
              ),
            ),
            SizedBox(
              height: 130,
            ),
            Text('New User? Create Account')
          ],
        ),
      ),
    );
  }
}