import 'dart:async';

import 'package:allo/components/custom_text_field.dart';
import 'package:allo/constants/app_colors.dart';
import 'package:allo/utils/bottom_round_clipper.dart';
import 'package:allo/widgets/login_page.dart';
import 'package:flutter/material.dart';
import 'package:supabase_flutter/supabase_flutter.dart';
import '../main.dart';

class RegisterPage extends StatefulWidget {
  @override
  _RegisterPageState createState() => _RegisterPageState();
}

class _RegisterPageState extends State<RegisterPage> {
  final TextEditingController usernameController = TextEditingController();
  final TextEditingController emailController = TextEditingController();
  final TextEditingController passwordController = TextEditingController();
  late final StreamSubscription<AuthState> authSubscription;

  @override
  void initState() {
    super.initState();
    authSubscription = supabase.auth.onAuthStateChange.listen((event) {
      final session = event.session;
      if (session != null) {
        Navigator.of(context).pushReplacementNamed('/acccount');
      }
    });
  }

  @override
  void dispose() {
    usernameController.dispose();
    emailController.dispose();
    passwordController.dispose();
    authSubscription.cancel();
    super.dispose();
  }

  Future<void> register(BuildContext context) async {
    final String username = usernameController.text.trim();
    final String email = emailController.text.trim();
    final String password = passwordController.text.trim();

    if (username.isEmpty || email.isEmpty || password.isEmpty) {
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(
          content: Text('Veuillez remplir tous les champs.'),
          backgroundColor: Colors.red,
        ),
      );
      return;
    }

    if (password.length < 6) {
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(
          content:
              Text('Le mot de passe doit comporter au moins 6 caractères.'),
          backgroundColor: Colors.red,
        ),
      );
      return;
    }

    try {
      final response =
          await supabase.auth.signUp(email: email, password: password);
      if (response.user == null) {
        throw Exception('Inscription échouée.');
      }

      final user = supabase.auth.currentUser;
      if (user != null) {
        await supabase.from('UTILISATEUR').insert([
          {
            'idUtilisateur': int.parse(user.id),
            'nomUtilisateur': username,
            'emailUtilisateur': email,
            'mdpUtilisateur': password,
          }
        ]);

        print('Résultat de l\'insertion : $response');

        Navigator.push(
          context,
          MaterialPageRoute(builder: (context) => LoginPage()),
        );
      }
    } catch (e) {
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(
          content: Text('Erreur : $e'),
          backgroundColor: Colors.red,
        ),
      );
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      resizeToAvoidBottomInset: false,
      body: LayoutBuilder(
        builder: (BuildContext context, BoxConstraints constraints) {
          return Stack(
            children: [
              Column(
                crossAxisAlignment: CrossAxisAlignment.stretch,
                children: [
                  Container(
                    height: constraints.maxHeight * 0.25,
                    child: ClipPath(
                      clipper: BottomRoundClipper(),
                      child: Transform.translate(
                        offset: Offset(0, 0),
                        child: Transform.scale(
                          scale: 1.2,
                          child: Image.asset(
                            'assets/register.png',
                            fit: BoxFit.cover,
                          ),
                        ),
                      ),
                    ),
                  ),
                  Padding(
                    padding: EdgeInsets.fromLTRB(20.0, 15, 20, 10),
                    child: Form(
                      child: Column(
                        crossAxisAlignment: CrossAxisAlignment.stretch,
                        children: [
                          Text(
                            'M\'inscrire',
                            style: TextStyle(
                              fontSize: 28.0,
                              color: AppColors.dark,
                              fontFamily: "NeueRegrade",
                              fontWeight: FontWeight.bold,
                            ),
                          ),
                          CustomTextField(
                              controller: usernameController,
                              label: "Nom d'utilisateur",
                              hint: "Nom d'utilisateur...",
                              iconPath: "assets/icons/user.svg"),
                          CustomTextField(
                              controller: emailController,
                              label: "E-mail",
                              hint: "E-mail...",
                              iconPath: "assets/icons/email.svg"),
                          CustomTextField(
                              controller: passwordController,
                              label: "Mot de passe",
                              hint: "Mot de passe...",
                              iconPath: "assets/icons/key.svg",
                              obscureText: true),
                        ],
                      ),
                    ),
                  ),
                ],
              ),
              Positioned(
                bottom: 0,
                left: 0,
                right: 0,
                child: Padding(
                  padding: const EdgeInsets.fromLTRB(10, 0, 10, 25),
                  child: LayoutBuilder(
                    builder: (context, constraints) {
                      double buttonWidth = constraints.maxWidth /
                          2.2; // 1.1 (pour le bouton de gauche) + 1.1 * 1.2 (pour le bouton de droite) = 2.2

                      return Row(
                        mainAxisAlignment: MainAxisAlignment.spaceEvenly,
                        children: [
                          Container(
                            width:
                                buttonWidth, // Le bouton de gauche prend 45% de la largeur disponible
                            child: ElevatedButton(
                              onPressed: () {
                                Navigator.push(
                                  context,
                                  MaterialPageRoute(
                                      builder: (context) => LoginPage()),
                                );
                              },
                              style: ButtonStyle(
                                backgroundColor: MaterialStateProperty.all(
                                    AppColors.secondary),
                                padding: MaterialStateProperty.all(
                                    EdgeInsets.symmetric(vertical: 15.0)),
                                elevation: MaterialStateProperty.all(0.0),
                              ),
                              child: Text(
                                'Connexion',
                                style: TextStyle(
                                  color: Color(0xFF0F0D11),
                                  fontSize: 18.0,
                                ),
                              ),
                            ),
                          ),
                          SizedBox(width: 10),
                          Container(
                            width: buttonWidth * 1.2 -
                                10, // Le bouton de droite est 20% plus grand que le bouton de gauche
                            child: ElevatedButton(
                              onPressed: () => register(context),
                              style: ButtonStyle(
                                backgroundColor: MaterialStateProperty.all(
                                    AppColors.primary),
                                padding: MaterialStateProperty.all(
                                    EdgeInsets.symmetric(vertical: 15.0)),
                                elevation: MaterialStateProperty.all(0.0),
                              ),
                              child: Text(
                                'Inscription',
                                style: TextStyle(
                                  color: Color(0xFF0F0D11),
                                  fontSize: 18.0,
                                ),
                              ),
                            ),
                          ),
                        ],
                      );
                    },
                  ),
                ),
              ),
            ],
          );
        },
      ),
    );
  }
}
je veux faire un système d'inscription. j'ai validé l'email d'envoie avec supabase mais ça ne crée pas l'utilisateur dans ma table UTILISATEUR : 
DROP TRIGGER IF EXISTS verifierNbPhotos ON PHOTO_ANNONCE;
DROP TRIGGER IF EXISTS verifierNbCategories ON CATEGORISER_OBJET;
DROP TABLE IF EXISTS REPONSE CASCADE;
DROP TABLE IF EXISTS CATEGORISER_OBJET CASCADE;
DROP TABLE IF EXISTS CATEGORISER_ANNONCE CASCADE;
DROP TABLE IF EXISTS CATEGORIE CASCADE;
DROP TABLE IF EXISTS PHOTO_ANNONCE CASCADE;
DROP TABLE IF EXISTS ANNONCE CASCADE;
DROP TABLE IF EXISTS DONNER CASCADE;
DROP TABLE IF EXISTS AVIS CASCADE;
DROP TABLE IF EXISTS UTILISATEUR CASCADE;
DROP TABLE IF EXISTS OBJET CASCADE;

CREATE TABLE UTILISATEUR(
  idUtilisateur SERIAL PRIMARY KEY,
  nomUtilisateur VARCHAR(999) NOT NULL,
  emailUtilisateur VARCHAR(999) NOT NULL,
  mdpUtilisateur VARCHAR(999) NOT NULL,
  photoDeProfilUtilisateur BYTEA
);

CREATE TABLE AVIS(
  idAvis SERIAL PRIMARY KEY,
  titreAvis VARCHAR(999) NOT NULL,
  noteAvis INT,
  messageAvis VARCHAR(999) NOT NULL,
  dateAvis TIMESTAMP NOT NULL,
  idUtilisateur INT NOT NULL REFERENCES UTILISATEUR(idUtilisateur)
);

CREATE TABLE DONNER(
  idUtilisateur INT NOT NULL,
  idAvis INT NOT NULL,
  PRIMARY KEY (idUtilisateur, idAvis),
  FOREIGN KEY (idUtilisateur) REFERENCES UTILISATEUR (idUtilisateur),
  FOREIGN KEY (idAvis) REFERENCES AVIS (idAvis)
);

CREATE TABLE ANNONCE(
  idAnnonce SERIAL PRIMARY KEY,
  titreAnnonce VARCHAR(999) NOT NULL,
  descriptionAnnonce VARCHAR(999) NOT NULL,
  datePubliAnnonce TIMESTAMP NOT NULL,
  dateAideAnnonce TIMESTAMP NOT NULL,
  estUrgente BOOLEAN,
  etatAnnonce INT NOT NULL
);

CREATE TABLE PHOTO_ANNONCE(
  idPhotoAnnonce SERIAL PRIMARY KEY,
  photo BYTEA,
  idAnnonce INT NOT NULL REFERENCES ANNONCE(idAnnonce)
);

CREATE TABLE CATEGORIE(
  idCat SERIAL PRIMARY KEY,
  nomCat VARCHAR(999) NOT NULL
);

CREATE TABLE CATEGORISER_ANNONCE(
  idCat INT NOT NULL REFERENCES CATEGORIE(idCat),
  idAnnonce INT NOT NULL REFERENCES ANNONCE(idAnnonce),
  PRIMARY KEY (idCat, idAnnonce)
);


CREATE TABLE OBJET(
  idObjet SERIAL PRIMARY KEY,
  nomObjet VARCHAR(999) NOT NULL,
  descriptionObjet VARCHAR(999) NOT NULL,
  statutObjet INT,
  photoObjet BYTEA NOT NULL
);

CREATE TABLE CATEGORISER_OBJET(
  idObjet INT NOT NULL REFERENCES OBJET(idObjet),
  idAnnonce INT NOT NULL REFERENCES ANNONCE(idAnnonce),
  PRIMARY KEY (idObjet, idAnnonce)
);

CREATE TABLE REPONSE(
  idReponse SERIAL PRIMARY KEY,
  commentaireReponse VARCHAR(999) NOT NULL,
  estAcceptee BOOLEAN,
  prix INT NOT NULL,
  idUtilisateur INT NOT NULL REFERENCES UTILISATEUR(idUtilisateur),
  idAnnonce INT NOT NULL REFERENCES ANNONCE(idAnnonce),
  idObjet INT NOT NULL
);


ALTER TABLE REPONSE
ADD CONSTRAINT fk_idObjet
FOREIGN KEY (idObjet) REFERENCES OBJET(idObjet);


CREATE OR REPLACE FUNCTION compterNbPhotos() RETURNS TRIGGER AS $$
BEGIN
    IF (SELECT COUNT(*) FROM PHOTO_ANNONCE WHERE idAnnonce = NEW.idAnnonce) >= 4 THEN
        RAISE EXCEPTION 'Vous ne pouvez pas ajouter plus de 4 photos pour cette annonce.';
    END IF;
    RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER verifierNbPhotos
BEFORE INSERT ON PHOTO_ANNONCE
FOR EACH ROW
EXECUTE FUNCTION compterNbPhotos();

CREATE OR REPLACE FUNCTION compterNbCategories() RETURNS TRIGGER AS $$
BEGIN
    IF (SELECT COUNT(*) FROM CATEGORISER_OBJET WHERE idObjet = NEW.idObjet) >= 5 THEN
        RAISE EXCEPTION 'Un objet ne peut pas avoir plus de 5 catégories.';
    END IF;
    RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER verifierNbCategories
BEFORE INSERT ON CATEGORISER_OBJET
FOR EACH ROW
EXECUTE FUNCTION compterNbCategories();