-- Trigger 3
CREATE OR REPLACE TRIGGER CORRELATIVE_INCREMENT_CIUDAD
BEFORE INSERT
ON CIUDAD

FOR EACH ROW
DECLARE
    v_id_ciudad CIUDAD.ID_CIUDAD%TYPE;
    v_id_ciudad_busqueda CIUDAD.ID_CIUDAD%TYPE;

BEGIN
    SELECT MAX(ID_CIUDAD) INTO v_id_ciudad FROM CIUDAD;

    IF (:NEW.ID_CIUDAD IS NOT NULL) AND (v_id_ciudad IS NOT NULL) THEN 
        IF (v_id_ciudad+1) < :NEW.ID_CIUDAD THEN
            RAISE_APPLICATION_ERROR(-20000, 'No se puede insertar! El ID ingresado es mayor al ID maximo de la tabla!');
        END IF;
    ELSE
        IF v_id_ciudad IS NULL THEN  
            :NEW.ID_CIUDAD := 1;
        ELSE
            IF :NEW.ID_CIUDAD IS NOT NULL THEN
                SELECT ID_CIUDAD INTO v_id_ciudad_busqueda
                FROM CIUDAD WHERE (ID_CIUDAD = :NEW.ID_CIUDAD);
                
                IF v_id_ciudad_busqueda IS NOT NULL THEN
                    RAISE_APPLICATION_ERROR(-20001, 'No se puede insertar! El ID ingresado ya existe!');
                END IF;
            ELSE
                :NEW.ID_CIUDAD := v_id_ciudad + 1;
            END IF;
        END IF;
    END IF;
END;
/

-- Trigger 4
CREATE OR REPLACE TRIGGER VALIDACION_PRE_COMPETENCIA
BEFORE INSERT
ON PARTICIPAR_COMPETENCIA

FOR EACH ROW
DECLARE
    CURSOR PARTICIPAR_PRECO IS
        SELECT PPC.ID_PRECOMPETENCIA
        FROM PARTICIPAR_PRECOMPETENCIA PPC
        LEFT JOIN PRECOMPETENCIA PC ON (PC.ID_PRECOMPETENCIA = PPC.ID_PRECOMPETENCIA)
        WHERE (PPC.ID_ATLETA = :NEW.ID_ATLETA AND PC.COMPETENCIA = :NEW.ID_COMPETENCIA);
        
        v_id_precompetencia PARTICIPAR_PRECOMPETENCIA.ID_PRECOMPETENCIA%TYPE;
        
BEGIN
    OPEN PARTICIPAR_PRECO;
        FETCH PARTICIPAR_PRECO INTO v_id_precompetencia;
        IF PARTICIPAR_PRECO%FOUND THEN 
            DBMS_OUTPUT.PUT_LINE('El atleta ha participado en precompetencias asociadas.');
        ELSE
            RAISE_APPLICATION_ERROR(-20002, 'No se puede insertar! El atleta no posee precompetencias asociadas a la competencia!');
        END IF;
    CLOSE PARTICIPAR_PRECO;
END;
/

-- Trigger 5
CREATE OR REPLACE TRIGGER CALCULAR_VALOR_DELEGACION
BEFORE INSERT OR UPDATE
ON HOSPEDAR

FOR EACH ROW
DECLARE
    v_atletas DELEGACION.CANTIDAD_ATLETAS%TYPE;

BEGIN
    IF INSERTING THEN
        SELECT CANTIDAD_ATLETAS INTO v_atletas
        FROM DELEGACION WHERE (ID_DELEGACION = :NEW.ID_DELEGACION);

        :NEW.PRECIO_DELEGACION := v_atletas * :NEW.PRECIO_ATLETA;
    ELSIF UPDATING THEN
        SELECT CANTIDAD_ATLETAS INTO v_atletas
        FROM DELEGACION WHERE (ID_DELEGACION = :NEW.ID_DELEGACION);

        :NEW.PRECIO_DELEGACION := v_atletas * :NEW.PRECIO_ATLETA;
    END IF;
END;
/
