CREATE OR ALTER PROCEDURE SPU_REPROGRAMACAO_BOJO (
    estabelecimento_1 integer,
    tipo_1 char(1),
    gp_1 integer,
    up_1 integer,
    estacao_1 integer,
    datahora timestamp)
as
declare variable tempo numeric(15,4);
declare variable tabela_id integer;
declare variable programacao_id integer;
declare variable tempo_programacao numeric(15,4);
declare variable datahora_partida timestamp;
declare variable datahora_remessa timestamp;
declare variable data_partida date;
declare variable turno_hora time;
declare variable programacao_id_2 integer;
declare variable datahora_inicio_2 timestamp;
declare variable datahora_fim_2 timestamp;
declare variable data_2 date;
declare variable minuto_inicio_2 numeric(15,4);
declare variable minuto_fim_2 numeric(15,4);
declare variable tempo_2 numeric(15,4);
BEGIN

      --Status
      --0 - Parado
      --1 - Iniciado, mas parado
      --2 - Em andamento
      --3 - Finalizado
      --4 - Encerrado

    EXECUTE PROCEDURE SPU_PROGRAMACAO_TEMPO(:ESTABELECIMENTO_1,:GP_1,:UP_1,:ESTACAO_1);


    /* VERIFICA SE FOI PASSADA ALGUMA DATA NO PARAMENTRO */
    IF ( DATAHORA IS NOT NULL ) THEN
    BEGIN
        DATAHORA_PARTIDA = DATAHORA;
    END
    ELSE
    BEGIN
    
        /* CAPTURA A PRIMEIRA DATA/HORA DISPONIVEL DA ESTACAO (SE ESTIVER EM PRODUCAO) */
        SELECT
            DATAHORA_PARTIDA,
            CAST(DATAHORA_PARTIDA AS DATE) DATA_PARTIDA
        FROM (
            SELECT
                (SELECT FIRST 1 DATEADD(1 MINUTE TO P.DATAHORA_FIM)
                      FROM TBPROGRAMACAO P
                     WHERE P.ESTABELECIMENTO_ID = :ESTABELECIMENTO_1
                       AND P.TIPO = 'A'
                       AND P.GP_ID = :GP_1
                       AND P.UP_ID = :UP_1
                       AND P.ESTACAO = :ESTACAO_1
                       AND P.STATUS = 2
                     ORDER BY DATAHORA_FIM DESC) DATAHORA_PARTIDA
            FROM
            RDB$DATABASE )
         INTO
            :DATAHORA_PARTIDA,
            :DATA_PARTIDA;

        /* SE ESTACAO ESTIVER EM PRODUCAO, PEGARA A PRIMEIRA HORA DISPONIVEL APOS O TALAO EM PRODUCAO, SENAO PEGARA A DATAHORA CORRENTE */
        DATAHORA_PARTIDA = COALESCE(:DATAHORA_PARTIDA,CURRENT_TIMESTAMP);
    END

    FOR
        SELECT
            ID,
            TEMPO,
            TABELA_ID,
            DATAHORA_REMESSA
        FROM (
            SELECT A.ID, TEMPO, A.TABELA_ID, CAST(A.DATA AS TIMESTAMP) DATAHORA_REMESSA, A.DATAHORA_INICIO, A.DATA
              FROM TBPROGRAMACAO A
             WHERE A.ESTABELECIMENTO_ID = :ESTABELECIMENTO_1
               AND A.TIPO    = :TIPO_1
               AND A.GP_ID   = :GP_1
               AND A.UP_ID   = :UP_1
               AND A.ESTACAO = :ESTACAO_1
               AND A.STATUS  < 2
               AND NOT (A.STATUS = 1 AND A.STATUS_REQUISICAO = 1)
               AND A.QUANTIDADE > 0
            ) Z
        ORDER BY DATAHORA_INICIO
        --ORDER BY DATA,DATAHORA_INICIO
        --alterado para taloes de datas diferentes se misturarem
    
    INTO
        :PROGRAMACAO_ID,
        :TEMPO,
        :TABELA_ID,
        :DATAHORA_REMESSA
    DO
    BEGIN
    
        IF ( :DATAHORA_REMESSA > :DATAHORA_PARTIDA  ) THEN
        BEGIN
            DATAHORA_PARTIDA = :DATAHORA_REMESSA;
        END


        DATA_PARTIDA =
        IIF(
            CAST((DATAHORA_PARTIDA/* - (1.00000/24/60)*/) AS TIME) < (SELECT FIRST 1 T.HORA_INICIO FROM TBTURNO_PRODUCAO T WHERE T.CODIGO = 1 AND T.DIA_SEMANA = EXTRACT(WEEKDAY FROM CAST(:DATAHORA_PARTIDA AS DATE))),
            (SELECT FIRST 1 C.DATA
               FROM TBCALENDARIO_UP_ESTACAO C
              WHERE C.UP_ID = :UP_1
                AND C.ESTACAO = :ESTACAO_1
                AND C.MINUTOS > 0
                AND C.DATA < CAST(:DATAHORA_PARTIDA AS DATE)
              ORDER BY C.DATA DESC),
            (SELECT FIRST 1 C.DATA
               FROM TBCALENDARIO_UP_ESTACAO C
              WHERE C.UP_ID = :UP_1
                AND C.ESTACAO = :ESTACAO_1
                AND C.MINUTOS > 0
                AND C.DATA >= CAST(:DATAHORA_PARTIDA AS DATE)
              ORDER BY C.DATA)
        );
              /*
        UPDATE TBPROGRAMACAO P
           SET P.DATA = :DATA_PARTIDA
         WHERE P.ID   = :PROGRAMACAO_ID;
         */

        DATAHORA_PARTIDA = (
        SELECT DATAHORA_FIM
          FROM SPU_PROGRAMACAO_BOJO (
               :ESTABELECIMENTO_1,
               :TIPO_1,
               :PROGRAMACAO_ID,
               :DATAHORA_PARTIDA,
               :GP_1,
               :UP_1,
               :TEMPO,
               :ESTACAO_1
            )
        );

    END




--    FOR
--        SELECT P.ID,
--               P.DATAHORA_INICIO,
--               P.DATAHORA_FIM, 
--               P.TEMPO,
--               P.DATA
--          FROM TBPROGRAMACAO P
--         WHERE P.ESTABELECIMENTO_ID = :ESTABELECIMENTO_1
--           AND P.TIPO               = :TIPO_1
--           AND P.GP_ID              = :GP_1
--           AND P.UP_ID              = :UP_1
--           AND P.ESTACAO            = :ESTACAO_1
--           AND P.STATUS IN ('0','1')
--           AND NOT (P.STATUS = 1 AND P.STATUS_REQUISICAO = 1)
--         ORDER BY DATAHORA_INICIO
--    INTO
--        :PROGRAMACAO_ID_2,
--        :DATAHORA_INICIO_2,
--        :DATAHORA_FIM_2,
--        :TEMPO_2,
--        :DATA_2
--    DO
--    BEGIN
--
--        MINUTO_INICIO_2 = ((:TURNO_HORA - CAST('00:00:00' AS TIME))/60) +
--        (SELECT COUNT(*)
--           FROM SPC_CALENDARIO_ESTACAO(
--                :UP_1,
--                :ESTACAO_1,
--                CAST(:DATA_2 || ' 00:00'/* || :TURNO_HORA*/ AS TIMESTAMP),
--                :DATAHORA_INICIO_2)
--          WHERE PRODUTIVO = '1');
--
--        UPDATE TBPROGRAMACAO P
--           SET P.MINUTO_INICIO = :MINUTO_INICIO_2,
--               P.MINUTO_FIM    = :MINUTO_INICIO_2 + :TEMPO_2 - 1
--         WHERE P.ID            = :PROGRAMACAO_ID_2;
--
--    END

END;

