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

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

import '../main.dart';

import '../classes/alert.dart';

import '../variable/globals.dart' as globals;

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

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

class AddProfile extends StatefulWidget {
  const AddProfile({super.key});

  @override
  _AddProfileState createState() => _AddProfileState();
}

class _AddProfileState extends State<AddProfile> with ShowAlertDialog {
  TextEditingController inputUserName = TextEditingController();

  TextEditingController inputName = TextEditingController();

  TextEditingController inputFirstName = TextEditingController();
  TextEditingController inputEmail = TextEditingController();
  TextEditingController inputBirth = TextEditingController();
  TextEditingController inputPassword = TextEditingController();
  TextEditingController inputPasswordConfirmed = TextEditingController();

  onTapFunctionDatePicker({required BuildContext context}) async {
    DateTime? pickedDate = await showDatePicker(
        context: context,
        firstDate: DateTime(1900),
        initialDate: DateTime.now(),
        lastDate: DateTime(2104));
    if (pickedDate == null) return;
    inputBirth.text = DateFormat("dd/MM/yyyy").format(pickedDate);
  }

  convertNulltoEmptyString(var check) {
    if (check == null) {
      return "";
    }
    return check;
  }

  convertNulltoArray(List<String> check) {
    if (check == null) {
      return [];
    }
    return check;
  }

  String formatDate(String date) {
    var splitedDate = date.split("/");

    var day = splitedDate[0];
    var month = splitedDate[1];
    var year = splitedDate[2];

    return "${year}-${month}-${day}";
  }

  Future<void> _createProfile(BuildContext context) async {
    var username = inputUserName.text;
    var firstName = inputFirstName.text;
    var name = inputName.text;
    var email = inputEmail.text;
    var password = inputPassword.text;
    var confirmedPassword = inputPasswordConfirmed.text;
    var birth = DateTime.parse(formatDate(inputBirth.text));

    if ((password.isNotEmpty) && (confirmedPassword.isNotEmpty)) {
      if (password != confirmedPassword) {
        showAlertDialog(context, "Erreur", "Mot de passe different");
        return;
      }
    }

    var urlPut = Uri.parse("${globals.api}/mail");

    var responsePost = await http.post(urlPut,
        headers: {
          HttpHeaders.acceptHeader: 'application/json, text/plain, */*',
          HttpHeaders.contentTypeHeader: 'application/json'
        },
        body: jsonEncode({
          'name': name,
          'username': username,
          'firstName': firstName,
          'password': password,
          'email': email,
          'birth': birth.toString()
        }));
    print(responsePost.statusCode);
    if (responsePost.statusCode == 200) {
      showAlertDialog(context, "Creation", "Votre utilisateur a été créé");
      Navigator.pushReplacement(
          context, MaterialPageRoute(builder: (_) => LoginDemo()));
      return;
    }

    final errorMessages = {
      400: "Requête mal construite",
      406: "Mot de passe incorrect",
      404: "Utilisateur inconnu",
      403: "Utilisateur désactivé",
      410: "Token invalide",
      500: "Problème interne du serveur",
    };

    final text = errorMessages[responsePost.statusCode] ??
        "Problème d'authentification inconnu";
    showAlertDialog(context, "Erreur serveur", text);
  }

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

  final _formKey = GlobalKey<FormState>();
  String? _validateField(String? value) {
    return value!.isEmpty ? 'Champ requis' : null;
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        backgroundColor: Colors.white,
        appBar: AppBar(
          title: Text("Create profile"),
          backgroundColor: Colors.blue,
          foregroundColor: Colors.white,
        ),
        body: Form(
          key: _formKey,
          child: SingleChildScrollView(
            child: Column(
              children: <Widget>[
                Padding(
                  padding: const EdgeInsets.only(
                      left: 15.0, right: 15.0, top: 15, bottom: 0),
                  //padding: EdgeInsets.symmetric(horizontal: 15),
                  child: TextFormField(
                    controller: inputUserName,
                    validator: (value) => _validateField(value),
                    decoration: InputDecoration(
                        border: OutlineInputBorder(),
                        labelText: 'Pseudo',
                        hintText: 'Modifier le pseudo'),
                  ),
                ),
                Padding(
                  padding: const EdgeInsets.only(
                      left: 15.0, right: 15.0, top: 15, bottom: 0),
                  //padding: EdgeInsets.symmetric(horizontal: 15),
                  child: TextFormField(
                    controller: inputPassword,
                    validator: (value) => _validateField(value),
                    obscureText: true,
                    decoration: InputDecoration(
                        border: OutlineInputBorder(),
                        labelText: 'Mot de passe',
                        hintText: 'Entrez le mot de passe'),
                  ),
                ),
                Padding(
                  padding: const EdgeInsets.only(
                      left: 15.0, right: 15.0, top: 15, bottom: 0),
                  //padding: EdgeInsets.symmetric(horizontal: 15),
                  child: TextFormField(
                    controller: inputPasswordConfirmed,
                    validator: (value) => _validateField(value),
                    obscureText: true,
                    decoration: InputDecoration(
                        border: OutlineInputBorder(),
                        labelText: 'Confirmez le mot de passe',
                        hintText: 'Confirmez le mot de passe'),
                  ),
                ),
                Padding(
                  padding: const EdgeInsets.only(
                      left: 15.0, right: 15.0, top: 15, bottom: 0),
                  //padding: EdgeInsets.symmetric(horizontal: 15),
                  child: TextFormField(
                    controller: inputName,
                    validator: (value) => _validateField(value),
                    decoration: InputDecoration(
                        border: OutlineInputBorder(),
                        labelText: 'Nom',
                        hintText: 'Modifier le nom'),
                  ),
                ),
                Padding(
                  padding: const EdgeInsets.only(
                      left: 15.0, right: 15.0, top: 15, bottom: 0),
                  //padding: EdgeInsets.symmetric(horizontal: 15),
                  child: TextFormField(
                    controller: inputFirstName,
                    validator: (value) => _validateField(value),
                    decoration: InputDecoration(
                        border: OutlineInputBorder(),
                        labelText: 'Prénom',
                        hintText: 'Modifier le prénom'),
                  ),
                ),
                Padding(
                  padding: const EdgeInsets.only(
                      left: 15.0, right: 15.0, top: 15, bottom: 0),
                  //padding: EdgeInsets.symmetric(horizontal: 15),
                  child: TextFormField(
                    controller: inputEmail,
                    validator: (value) => _validateField(value),
                    decoration: InputDecoration(
                        border: OutlineInputBorder(),
                        labelText: 'Email',
                        hintText: 'Modifier l\'adresse mail'),
                  ),
                ),
                Padding(
                  padding: const EdgeInsets.only(
                      left: 15.0, right: 15.0, top: 15, bottom: 0),
                  //padding: EdgeInsets.symmetric(horizontal: 15),
                  child: TextFormField(
                      controller: inputBirth,
                      readOnly: true,
                      validator: (value) => _validateField(value),
                      decoration: InputDecoration(
                          border: OutlineInputBorder(),
                          labelText: 'Date de naissance',
                          hintText: 'Cliquez ici pour selectionner une date'),
                      onTap: () => onTapFunctionDatePicker(context: context)),
                ),
                SizedBox(
                  height: 30,
                ),
                Container(
                  height: 50,
                  width: 250,
                  decoration: BoxDecoration(
                      color: Colors.blue,
                      borderRadius: BorderRadius.circular(20)),
                  child: TextButton(
                    onPressed: () {
                      if (_formKey.currentState!.validate()) {
                        _createProfile(context);
                      }
                    },
                    child: Text(
                      'Créer le profil',
                      style: TextStyle(color: Colors.white, fontSize: 25),
                    ),
                  ),
                )
              ],
            ),
          ),
        ));
  }
}