import 'package:card_swiper/card_swiper.dart';
import 'package:flutter/material.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:plataforma_educativa/src/models/hijos_model.dart';
import 'package:plataforma_educativa/src/models/local_user_model.dart';
import 'package:plataforma_educativa/src/providers/db_provider.dart';
import 'package:plataforma_educativa/src/providers/hijos_provider.dart';

import 'menu_page.dart';

class HomePage extends StatefulWidget {
  final String fcmToken;

  const HomePage({Key? key, required this.fcmToken}) : super(key: key);

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

class _HomePageState extends State<HomePage> {
  final _hijosProvider = HijosProvider();
  late HijosModel _hijosModel;
  late LocalUserModel _userModel;
  bool _loading = true;

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

    _init();
  }

  void _init() async{
    final escuelas = await DBProvider.db.getAllScans();
    final escuela = escuelas.first;

    final usuarios = await DBProvider.db.getAllUsers();
    final usuario = usuarios.first;

    final hijos = await _hijosProvider.fetchHijos(usuario.token, usuario.token, escuela.idEscuela);

    setState(() {
      _userModel = usuario;
      _hijosModel = hijos;
    });

    if(usuarios.length > 1){
      await DBProvider.db.deleteAllUsers();
      await DBProvider.db.newUserRaw(_userModel);
    }

    setState(() => _loading = false);
  }

  @override
  Widget build(BuildContext context) {
    final _screenSize = MediaQuery.of(context).size;
    return Scaffold(
      body: Container(
        width: _screenSize.width,
        height: _screenSize.height,
        decoration: const BoxDecoration(
          image: DecorationImage(
            image: AssetImage("assets/trt0.png"),
            fit: BoxFit.cover
          )
        ),
        child: _loading ? Center(
          child: Image.asset(
            "assets/loading.gif",
            width: 64.0,
          ),
        ) : Column(
          mainAxisAlignment: MainAxisAlignment.start,
          crossAxisAlignment: CrossAxisAlignment.center,
          children: [
            Container(
              margin: const EdgeInsets.only(
                top: 24.0
              ),
              padding: const EdgeInsets.symmetric(
                vertical: 16.0
              ),
              child: Text(
                "Elegir Perfil",
                style: GoogleFonts.montserrat(
                  fontSize: 20.0,
                  color: Colors.black38,
                  fontWeight: FontWeight.w500,
                ),
              ),
            ),
            Expanded(
              child: _loading ? Center(
                child: Image.asset(
                  "assets/loading.gif",
                  width: 64.0,
                ),
              ) : Swiper(
                itemBuilder: (context, index) => Container(
                  padding: const EdgeInsets.symmetric(
                    horizontal: 32.0
                  ),
                  child: Column(
                    children: [
                      const SizedBox(height: 8.0),
                      Image.asset(
                        "assets/ninop0.png",
                        width: _screenSize.width*0.7,
                        height: _screenSize.height*0.5,
                      ),
                      const SizedBox(height: 8.0),
                      SizedBox(
                        width: _screenSize.width*0.6,
                        child: Text(
                          _completeName(
                            index < _hijosModel.result.length ? _hijosModel.result[index].primerNombre : _userModel.primerNombre,
                            index < _hijosModel.result.length ? _hijosModel.result[index].segundoNombre : _userModel.segundoNombre,
                            index < _hijosModel.result.length ? _hijosModel.result[index].apellidoPaterno : _userModel.apellidoPaterno,
                            index < _hijosModel.result.length ? _hijosModel.result[index].apellidoMaterno : _userModel.apellidoMaterno,
                          ),
                          style: GoogleFonts.montserrat(
                            color: const Color.fromRGBO(22, 23, 112, 1),
                            fontSize: 18.0,
                            fontWeight: FontWeight.bold,
                            letterSpacing: 0.17,
                          ),
                          textAlign: TextAlign.center,
                        ),
                      ),
                      const SizedBox(height: 8.0),
                      Text(
                        index < _hijosModel.result.length ? _hijosModel.result[index].nombreGrado : 'Padre de Familia',
                        style: GoogleFonts.montserrat(
                          color: const Color.fromRGBO(56, 109, 160, 1),
                          fontSize: 16.0,
                          fontWeight: FontWeight.normal,
                        ),
                      ),
                      Expanded(
                        child: Container(),
                      ),
                      _botonElegir(
                        context,
                        index >= _hijosModel.result.length,
                        index < _hijosModel.result.length ? _hijosModel : null,
                        index,
                      ),
                    ],
                  ),
                ),
                itemCount: _hijosModel.result.length + 1,
                pagination: const SwiperPagination(
                  builder: DotSwiperPaginationBuilder(
                    activeColor: Color.fromRGBO(56, 109, 160, 1),
                    color: Color.fromRGBO(9, 0, 36, 0.25),
                    size: 4.0,
                    activeSize: 6.0,
                    space: 12.0
                  ),
                ),
              ),
            )
          ],
        ),
      ),
    );
  }

  Widget _botonElegir(BuildContext context, bool esCuentaPropia, HijosModel? hijos, int index){
    return StreamBuilder(
      builder: (BuildContext context, AsyncSnapshot snapshot){
        return ElevatedButton(
          child: Container(
            padding: const EdgeInsets.symmetric(vertical: 15.0),
            width: MediaQuery.of(context).size.width*0.60,
            child: Text('Elegir', style: GoogleFonts.montserrat(color: Colors.white, fontWeight: FontWeight.bold, fontSize: 12.0), textAlign: TextAlign.center),
          ),
          style: ElevatedButton.styleFrom(
            shape: RoundedRectangleBorder(
              borderRadius: BorderRadius.circular(50.0),
            ),
            elevation: 0.0,
            primary: const Color.fromRGBO(22, 23, 112, 1),
          ),
          onPressed: () {
            if(!esCuentaPropia){
              final gradoNivel = _hijosModel.result[index].nombreGrado.split(" ");
              final setUser = LocalUserModel(
                idUsuario: _hijosModel.result[index].idUsuario,
                primerNombre: _hijosModel.result[index].primerNombre,
                segundoNombre: _hijosModel.result[index].segundoNombre,
                tipoUsuario: "AL",
                apellidoPaterno: _hijosModel.result[index].apellidoPaterno,
                apellidoMaterno: _hijosModel.result[index].apellidoMaterno,
                active: _userModel.active,
                until: _userModel.until,
                secretKey: _hijosModel.result[index].claveSecreta == null ? 'no-data' : _hijosModel.result[index].claveSecreta,
                publicKey: _hijosModel.result[index].clavePublica == null ? 'no-data' : _hijosModel.result[index].clavePublica,
                grado: gradoNivel[0].replaceAll("°", ""),
                nivel: gradoNivel[1],
                token: _userModel.token,
              );
              DBProvider.db.newUserRaw(setUser);
            }
            Navigator.push(context, MaterialPageRoute(
              builder: (context) => MenuPage(
                esPadre: true,
                revisaHijo: !esCuentaPropia,
                fcmToken: widget.fcmToken,
              ),
            ));
          },
        );
      },
    );
  }

  String _completeName(String pNom, String sNom, String aPat, String aMat){
    String nom = '$pNom $sNom $aPat $aMat';
    nom = nom.replaceAll("null", "");
    nom = nom.replaceAll("  ", " ");

    return nom;
  }
}
