CREATE PROCEDURE `sp_configuracionencuestainsertar`(
    Ptipoencuesta varchar(500),
    Pfechainicio DATE,
    Pfechafin DATE,
    Phorainicio TIME,
    Phorafin TIME,
    Pestado varchar(50),
    OUT idconfiguracionencuesta INT,
    OUT success bit,
    OUT message VARCHAR(500)
)
BEGIN
	DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
BEGIN
ROLLBACK;
SET success = 0;
        SET message = "Violación de restricción de clave foránea o error en la base de datos";
END;

START TRANSACTION;
INSERT INTO configuracionencuesta(TipoEncuesta, FechaEncuestaInicio, FechaEncuestaFin, HoraEncuestaInicio, HoraEncuestaFin, EstadoConfiguracionEncuesta)
VALUES(Ptipoencuesta, Pfechainicio, Pfechafin, Phorainicio, Phorafin, Pestado);

IF ROW_COUNT() > 0 THEN
        SET idconfiguracionencuesta = LAST_INSERT_ID();
        SET success = 1;
        SET message = "OK";
ELSE
		SET idconfiguracionencuesta = 0;
        SET success = 0;
        SET message = "No se Registro nada en la Tabla configuracionencuesta, el procedimiento Almacenado 'sp_configuracionencuestainsertar' Tiene Fallas";
END IF;

COMMIT;
END;


CREATE PROCEDURE `sp_sectorencuestainsertar`(
    Pidpadronelectoral int,
    Pnombresector varchar(500),
    Pcantidadencuesta int,
    Pmuestra int,
    Pmuestracant decimal(32,2),
    Pfecharegistro DATETIME,
    OUT idsectorencuesta INT,
    OUT success bit,
    OUT message VARCHAR(500)
)
BEGIN
	DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
    BEGIN
    ROLLBACK;
    SET success = 0;
            SET message = "Violación de restricción de clave foránea o error en la base de datos";
    END;

    START TRANSACTION;
    INSERT INTO sectorencuesta(IdPadronElectoral, NombreSector, CantEncuestaSector,Muestra,MuestraCant, EstadoSectorEncuesta, FechaRegistroSectorEncuesta)
    VALUES(Pidpadronelectoral, Pnombresector, Pcantidadencuesta, Pmuestra,Pmuestracant,"Activo", Pfecharegistro);

    IF ROW_COUNT() > 0 THEN
        SET idsectorencuesta = LAST_INSERT_ID();
        SET success = 1;
        SET message = "OK";
    ELSE
        SET success = 0;
        SET idsectorencuesta = 0;
        SET message = "No se Registro nada en la Tabla sectorencuesta, el procedimiento Almacenado 'sp_sectorencuestainsertar' Tiene Fallas";
    END IF;

    COMMIT;
END;

CREATE PROCEDURE `sp_grupoencuestainsertar`(
    Pidsectorencuesta int,
    Pnombregrupoencuesta varchar(500),
    Pcantidadencuestagrupo int,
    Pfecharegistro DATETIME,
    OUT idgrupoencuesta INT,
    OUT success bit,
    OUT message VARCHAR(500)
)
BEGIN
	DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
    BEGIN
    ROLLBACK;
    SET success = 0;
                SET message = "Violación de restricción de clave foránea o error en la base de datos";
    END;

    START TRANSACTION;
    INSERT INTO grupoencuesta(IdSectorEncuesta, NombreGrupoEncuesta, CantEncuestaGrupo, EstadoGrupoEncuesta, FechaRegistroGrupoEncuesta)
    VALUES(Pidsectorencuesta, Pnombregrupoencuesta, Pcantidadencuestagrupo, "Activo", Pfecharegistro);

    IF ROW_COUNT() > 0 THEN
        SET idgrupoencuesta = LAST_INSERT_ID();
        SET success = 1;
        SET message = "OK";
    ELSE
        SET success = 0;
        SET idgrupoencuesta = 0;
        SET message = "No se Registro nada en la Tabla grupoencuesta, el procedimiento Almacenado 'sp_grupoencuestainsertar' Tiene Fallas";
    END IF;

    COMMIT;
END;

CREATE PROCEDURE `sp_encuestadorasiginsertar`(
    Pidgrupoencuesta int,
    Pidusuarioencuesta int,
    Pidconfiguracionencuesta int,
    Pdireccionencuesta varchar(500),
    Pcantidadencuestausuario int,
    Pfecharegistro DATETIME,
    OUT idencuestadorasig INT,
    OUT success bit,
    OUT message VARCHAR(500)
)
BEGIN
	DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
    BEGIN
    ROLLBACK;
    SET success = 0;
                SET message = "Violación de restricción de clave foránea o error en la base de datos";
    END;

    START TRANSACTION;
    INSERT INTO encuestadorasig(IdGrupoEncuesta, IdUsuario, IdConfiguracionEncuesta, DireccionEncuesta, CantEncuestaUsuario, EstadoEncuestador, FechaRegistroEncuestador)
    VALUES(Pidgrupoencuesta, Pidusuarioencuesta,Pidconfiguracionencuesta,Pdireccionencuesta, Pcantidadencuestausuario, "Activo", Pfecharegistro);

    IF ROW_COUNT() > 0 THEN
                SET idencuestadorasig = LAST_INSERT_ID();
                SET success = 1;
                SET message = "OK";
    ELSE
                SET success = 0;
                 SET idencuestadorasig = 0;
                SET message = "No se Registro nada en la Tabla encuestadorasig, el procedimiento Almacenado 'sp_encuestadorasiginsertar' Tiene Fallas";
    END IF;

    COMMIT;
END;


CREATE PROCEDURE `sp_personainsertar`(
	PNombre VARCHAR(500),
	PApellido VARCHAR(500),
	PIdTipoDoc INT,
	PNumDoc VARCHAR(500),
	PCorreo VARCHAR(800),
	PRutaImagen VARCHAR(800),
    PUrlImagen varchar(800),
    PDireccion varchar(800),
    PIdDistrito int,
	PFechaRegistro DATETIME,
	OUT idpersona INT,
	OUT success BIT,
	OUT message VARCHAR(500)
)
BEGIN
	DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
    BEGIN
    ROLLBACK;
    SET success = 0;
                SET message = "Violación de restricción de clave foránea o error en la base de datos";
    END;

    START TRANSACTION;

    -- Manejo seguro de NombreCompleto si alguno es NULL
    INSERT INTO persona(Nombre, Apellido, NombreCompleto, IdTipoDoc, NumDoc, Correo, RutaImagen,UrlImagen, Direccion,IdDistrito, Estado, FechaRegistro)
    VALUES(PNombre, PApellido, CONCAT(IFNULL(PNombre, ''), ' ', IFNULL(PApellido, '')),
           PIdTipoDoc, PNumDoc, PCorreo, PRutaImagen,PUrlImagen,PDireccion,PIdDistrito, 'Activo', PFechaRegistro);

    IF ROW_COUNT() > 0 THEN
                SET idpersona = LAST_INSERT_ID();
                SET success = 1;
                SET message = "OK";
    ELSE
                SET success = 0;
                SET message = "No se registró nada en la tabla persona.";
    END IF;

    COMMIT;
END;

CREATE PROCEDURE `sp_personaestado`(
    IN sp_IdPersona INT,
    IN sp_Estado VARCHAR(500),
    OUT success BIT,
    OUT message VARCHAR(500)
)
BEGIN
    DECLARE EstadoActual VARCHAR(500) DEFAULT '';
    DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
    BEGIN
        ROLLBACK;
        SET success = 0;
        SET message = "Violación de restricción de clave foránea o error en la base de datos, el sp_personaestado Fallando";
    END;

    START TRANSACTION;

    -- Obtener el estado actual de la persona
    SELECT Estado INTO EstadoActual FROM persona WHERE IdPersona = sp_IdPersona;

    -- Si el estado actual es igual al nuevo estado, no hace nada
    IF (EstadoActual = sp_Estado) THEN
            SET success = 1;
            SET message = CONCAT("Persona ", sp_Estado, " Exitosamente");
    ELSE
            -- Actualiza el estado de la persona
    UPDATE persona SET Estado = sp_Estado WHERE IdPersona = sp_IdPersona;

    -- Si la actualización fue exitosa, devuelve un mensaje de éxito
    IF ROW_COUNT() > 0 THEN
                SET success = 1;
                SET message = CONCAT("Persona ", sp_Estado, " Exitosamente");
    ELSE
                -- Si no se actualizó, devuelve un mensaje de error
                SET success = 0;
                SET message = CONCAT("La Persona No Fue ", sp_Estado, ".");
    END IF;
    END IF;

    COMMIT;
END;


CREATE PROCEDURE `sp_usuarioestado`(
    IN sp_IdUsuario INT,
    IN sp_Estado VARCHAR(500),
    OUT success BIT,
    OUT message VARCHAR(500)
)
BEGIN
    DECLARE EstadoActual VARCHAR(500) DEFAULT '';
    DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
    BEGIN
        ROLLBACK;
        SET success = 0;
        SET message = "Violación de restricción de clave foránea o error en la base de datos, el sp_usuarioestado Fallando";
    END;

    START TRANSACTION;

    -- Obtener el estado actual del Usuario
    SELECT Estado INTO EstadoActual FROM usuario WHERE IdUsuario = sp_IdUsuario;

    -- Si el estado actual es igual al nuevo estado, no hace nada
    IF (EstadoActual = sp_Estado) THEN
            SET success = 1;
            SET message = CONCAT("Usuario ", sp_Estado, " Exitosamente");
    ELSE
            -- Actualiza el estado del Usuario
    UPDATE usuario SET Estado = sp_Estado WHERE IdUsuario = sp_IdUsuario;

    -- Si la actualización fue exitosa, devuelve un mensaje de éxito
    IF ROW_COUNT() > 0 THEN
                SET success = 1;
                SET message = CONCAT("Usuario ", sp_Estado, " Exitosamente");
    ELSE
                -- Si no se actualizó, devuelve un mensaje de error
                SET success = 0;
                SET message = CONCAT("el Usuario No Fue ", sp_Estado, ".");
    END IF;
    END IF;

    COMMIT;
END;

CREATE PROCEDURE `sp_usuarioinsertar`(
    UIdPersona INT,
    UIdRol INT,
    UIdPertido INT,
    ULogin varchar(800),
    UClave VARCHAR(500),
    UFechaRegistro DATETIME,
    OUT idusuario INT,
    OUT success bit,
    OUT message VARCHAR(500)
)
BEGIN
	DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
    BEGIN
    ROLLBACK;
    SET success = 0;
            SET message = "Violación de restricción de clave foránea o error en la base de datos, 'sp_usuarioinsertar'";
    END;

    START TRANSACTION;
    INSERT INTO usuario(IdPersona, IdRol,IdPartido, Login, Clave,Estado, FechaRegistro)
    VALUES(UIdPersona, UIdRol,UIdPertido, ULogin, UClave, 'Activo', UFechaRegistro);

    IF ROW_COUNT() > 0 THEN
            SET idusuario = LAST_INSERT_ID();
            SET success = 1;
            SET message = "Usuario Registrado Correctamente";
    ELSE
            SET success = 0;
            SET message = "No se Registro nada en la Tabla usuario, el procedimiento Almacenado 'sp_usuarioinsertar' Tiene Fallas";
    END IF;

    COMMIT;
END;

CREATE PROCEDURE `sp_partidoinsertar`(
    Pnombre varchar(500),
    Psigla varchar(500),
    Plogo varchar(800),
    Pfecharegistro DATETIME,
    OUT idpartido INT,
    OUT success bit,
    OUT message VARCHAR(500)
)
BEGIN
	DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
    BEGIN
        ROLLBACK;
        SET success = 0;
        SET message = "Violación de restricción de clave foránea o error en la base de datos";
    END;

    START TRANSACTION;
    INSERT INTO partidopolitico(Nombre, Sigla, Logo, Estado, FechaRegistro)
    VALUES(Pnombre, Psigla, Plogo, "Activo", Pfecharegistro);

    IF ROW_COUNT() > 0 THEN
        SET idpartido = LAST_INSERT_ID();
        SET success = 1;
        SET message = "OK";
    ELSE
        SET success = 0;
        SET message = "No se Registro nada en la Tabla partidopolitico, el procedimiento Almacenado 'sp_partidoinsertar' Tiene Fallas";
    END IF;

    COMMIT;
END;


CREATE PROCEDURE `sp_partidoestado`(
    IN sp_IdPartido INT,
    IN sp_Estado VARCHAR(500),
    OUT success BIT,
    OUT message VARCHAR(500)
)
BEGIN
    DECLARE EstadoActual VARCHAR(500) DEFAULT '';
    DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
    BEGIN
        ROLLBACK;
        SET success = 0;
        SET message = "Violación de restricción de clave foránea o error en la base de datos, el sp_partidoestado Fallando";
    END;

    START TRANSACTION;

    -- Obtener el estado actual del Partido
    SELECT Estado INTO EstadoActual FROM partidopolitico WHERE IdPartido = sp_IdPartido;

    -- Si el estado actual es igual al nuevo estado, no hace nada
    IF (EstadoActual = sp_Estado) THEN
                SET success = 1;
                SET message = CONCAT("Partido ", sp_Estado, " Exitosamente");
    ELSE
                -- Actualiza el estado del Partido
    UPDATE partidopolitico SET Estado = sp_Estado WHERE IdPartido = sp_IdPartido;

    -- Si la actualización fue exitosa, devuelve un mensaje de éxito
    IF ROW_COUNT() > 0 THEN
                    SET success = 1;
                    SET message = CONCAT("Partido ", sp_Estado, " Exitosamente");
    ELSE
                    -- Si no se actualizó, devuelve un mensaje de error
                    SET success = 0;
                    SET message = CONCAT("el Partido No Fue ", sp_Estado, ".");
    END IF;
    END IF;

    COMMIT;
END;

CREATE PROCEDURE `sp_centroactualizar`(
	IN p_IdCentro INT,
	IN p_Cordinador varchar(255)
)
BEGIN
    UPDATE centrosvotacion SET Cordinador = p_Cordinador, FechaModifica = NOW()
    WHERE IdCentro = p_IdCentro;
END;

CREATE PROCEDURE `sp_electoralpartidoinsertar`(
    pidelectoral int,
    pidpartido int,
    Pfecharegistro DATETIME,
    OUT idelectoralpartido INT,
    OUT success bit,
    OUT message VARCHAR(500)
)
BEGIN
	DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
    BEGIN
        ROLLBACK;
        SET success = 0;
        SET message = "Violación de restricción de clave foránea o error en la base de datos";
    END;

    START TRANSACTION;
    INSERT INTO electoralpartido(IdElectoral,IdPartido, Estado, FechaRegistro)
    VALUES(pidelectoral,pidpartido, "Activo", Pfecharegistro);

    IF ROW_COUNT() > 0 THEN
        SET idelectoralpartido = LAST_INSERT_ID();
        SET success = 1;
        SET message = "Nuevo Proceso Electoral Activado";
    ELSE
        SET idelectoralpartido = 0;
        SET success = 0;
        SET message = "No se Registro nada en la Tabla electoralpartido, el procedimiento Almacenado 'sp_electoralpartidoinsertar' Tiene Fallas";
    END IF;

    COMMIT;
END;

CREATE PROCEDURE `sp_candidatoinsertar`(
    pidpersona int,
    pidpartido int,
    Pfecharegistro DATETIME,
    OUT idcandidato INT,
    OUT success bit,
    OUT message VARCHAR(500)
)
BEGIN
	DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
    BEGIN
        ROLLBACK;
        SET success = 0;
        SET message = "Violación de restricción de clave foránea o error en la base de datos";
    END;

    START TRANSACTION;
    INSERT INTO candidato(IdPersona, IdPartido,Estado, FechaRegistro)
    VALUES(pidpersona, pidpartido, "Activo", Pfecharegistro);

    IF ROW_COUNT() > 0 THEN
            SET idcandidato = LAST_INSERT_ID();
            SET success = 1;
            SET message = "Candiato Registrado Correctamente.";
    ELSE
            SET idcandidato = 0;
            SET success = 0;
            SET message = "No se Registro nada en la Tabla candidato, el procedimiento Almacenado 'sp_candidatoinsertar' Tiene Fallas";
    END IF;

    COMMIT;
END;


CREATE PROCEDURE `sp_electoralcandidatoinsertar`(
    pidelectoral int,
    pidcandidato int,
    pidtipopostulacion int,
    piddistrito int,
    pidprovincia int,
    piddepartamento int,
    Pfecharegistro DATETIME,
    OUT idelectoralcandidato INT,
    OUT success bit,
    OUT message VARCHAR(500)
)
BEGIN
	DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
BEGIN
ROLLBACK;
SET success = 0;
        SET message = "Violación de restricción de clave foránea o error en la base de datos";
END;

START TRANSACTION;
INSERT INTO electoralcandidato(IdElectoral,IdCandidato, IdTipoPostulacion, IdDistrito,IdProvincia,IdDepartamento, Estado, FechaRegistro)
VALUES(pidelectoral, pidcandidato,pidtipopostulacion,piddistrito,pidprovincia,piddepartamento, "Activo", Pfecharegistro);

IF ROW_COUNT() > 0 THEN
        SET idelectoralcandidato = LAST_INSERT_ID();
        SET success = 1;
        SET message = "Candidato Guardado Correctamente";
ELSE
        SET idelectoralcandidato = 0;
        SET success = 0;
        SET message = "No se Registro nada en la Tabla electoralcandidato, el procedimiento Almacenado 'sp_electoralcandidatoinsertar' Tiene Fallas";
END IF;

COMMIT;
END;


CREATE PROCEDURE sp_votacioninsertar(
    Pidmesa int,
    Pidelectoral int,
    Pestado varchar(500),
    Pfecharegistro DATETIME,
    OUT idvotacion INT,
    OUT success bit,
    OUT message VARCHAR(500)
)
BEGIN
	DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
    BEGIN
    ROLLBACK;
    SET success = 0;
                SET message = "Violación de restricción de clave foránea o error en la base de datos";
    END;

    START TRANSACTION;
    INSERT INTO votacion(IdMesa, IdElectoral, Estado, FechaRegistro)
    VALUES(Pidmesa, Pidelectoral, Pestado, Pfecharegistro);

    IF ROW_COUNT() > 0 THEN
            SET idvotacion = LAST_INSERT_ID();
            update mesasvotacion set Estado = "Pendiente" WHERE IdMesa = Pidmesa;
            SET success = 1;
            SET message = "OK";
    ELSE
            SET idvotacion = 0;
            SET success = 0;
            SET message = "No se Registro nada en la Tabla votacion, el procedimiento Almacenado 'sp_votacioninsertar' Tiene Fallas";
    END IF;

    COMMIT;
END;

CREATE PROCEDURE sp_votaciondetalleinsertar(
    Pidvotacion int,
    Pidelectoralcandidato int,
    Pidtipovotos int,
    Pcant int,
    OUT iddetallevotacion INT,
    OUT success bit,
    OUT message VARCHAR(500)
)
BEGIN
	DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
    BEGIN
    ROLLBACK;
        SET success = 0;
        SET message = "Violación de restricción de clave foránea o error en la base de datos";
    END;

    START TRANSACTION;
    INSERT INTO votaciondetalle(IdVotacion, IdElectoralCandidato, IdTipoVoto, CantVotos)
    VALUES(Pidvotacion, Pidelectoralcandidato, Pidtipovotos, Pcant);

    IF ROW_COUNT() > 0 THEN
        SET iddetallevotacion = LAST_INSERT_ID();
        SET success = 1;
        SET message = "OK";
    ELSE
        SET iddetallevotacion = 0;
        SET success = 0;
        SET message = "No se Registro nada en la Tabla votaciondetalle, el procedimiento Almacenado 'sp_votaciondetalleinsertar' Tiene Fallas";
    END IF;

    COMMIT;
END;
