<?php
declare(strict_types=1);

use Phinx\Migration\AbstractMigration;

final class Task2303171811 extends AbstractMigration
{
    public function up(): void
    {
        $table = $this->table('produto.aceitacao_variedade_transgenica');
        $table->addColumn('fl_aceita_transgenica', 'boolean', ['default' => 'TRUE'])
              ->save();

        $builder = $this->getQueryBuilder();
        $builder->update('produto.aceitacao_variedade_transgenica')
                ->set('fl_aceita_transgenica', 'TRUE')
                ->execute();

        $this->execute('ALTER TABLE produto.aceitacao_variedade_transgenica DROP CONSTRAINT "PK_aceitacao_transgenica"');
        $this->execute('ALTER TABLE produto.aceitacao_variedade_transgenica ADD  CONSTRAINT "PK_aceitacao_transgenica" PRIMARY KEY (id_produto, id_estado, fl_aceita_transgenica)');
        
        $this->execute("CREATE OR REPLACE FUNCTION manutencao.ajusta_restricao_trans_false() RETURNS VOID AS $$
                        DECLARE
                            stSQL1      VARCHAR;
                            crCursor1   REFCURSOR;
                            reRecord1   RECORD;
                        
                            stSQL2      VARCHAR;
                            crCursor2   REFCURSOR;
                            reRecord2   RECORD;
                        BEGIN
                            stSQL1 := '
                                       SELECT produtos.id AS id_produto
                                         FROM produto.produtos
                                         JOIN produto.aceitacao_variedade_transgenica
                                           ON aceitacao_variedade_transgenica.id_produto = produtos.id
                                        WHERE produtos.id_safra IN (25,26)';
                        
                            OPEN crCursor1 FOR EXECUTE stSQL1;
                            LOOP
                                FETCH crCursor1 INTO reRecord1;
                                EXIT WHEN NOT FOUND;
                        
                                stSQL2 := '
                                           SELECT estados.id AS id_estado
                                             FROM sistema.estados
                                            WHERE estados.id != ALL(SELECT id_estado
                                                                      FROM produto.aceitacao_variedade_transgenica
                                                                     WHERE id_produto = '|| reRecord1.id_produto ||')
                                          ';
                        
                                OPEN crCursor2 FOR EXECUTE stSQL2;
                                LOOP
                                    FETCH crCursor2 INTO reRecord2;
                                    EXIT WHEN NOT FOUND;
                        
                                    INSERT
                                      INTO produto.aceitacao_variedade_transgenica
                                         ( id_usuario_criacao
                                         , dt_criacao
                                         , id_produto
                                         , id_estado
                                         , fl_aceita_transgenica
                                         )
                                    VALUES
                                         ( 2068
                                         , NOW()
                                         , reRecord1.id_produto
                                         , reRecord2.id_estado
                                         , 'FALSE'
                                         );
                        
                                END LOOP;
                                CLOSE crCursor2;
                        
                            END LOOP;
                            CLOSE crCursor1;
                        END;
                        $$ LANGUAGE 'plpgsql'"
                      );
        $this->execute("SELECT manutencao.ajusta_restricao_trans_false()");
        $this->execute("DROP FUNCTION manutencao.ajusta_restricao_trans_false()");
        
        $table = $this->table('produto.aceitacao_variedade_transgenica');
        $rows = [
                   ['id_usuario_criacao' => 2068, 'dt_criacao' => 'NOW()', 'id_produto' => 1482, 'id_estado' =>  1, 'fl_aceita_transgenica' =>  TRUE],
                   ['id_usuario_criacao' => 2068, 'dt_criacao' => 'NOW()', 'id_produto' => 1482, 'id_estado' =>  2, 'fl_aceita_transgenica' =>  TRUE],
                   ['id_usuario_criacao' => 2068, 'dt_criacao' => 'NOW()', 'id_produto' => 1482, 'id_estado' =>  3, 'fl_aceita_transgenica' =>  TRUE],
                   ['id_usuario_criacao' => 2068, 'dt_criacao' => 'NOW()', 'id_produto' => 1482, 'id_estado' =>  4, 'fl_aceita_transgenica' =>  TRUE],
                   ['id_usuario_criacao' => 2068, 'dt_criacao' => 'NOW()', 'id_produto' => 1482, 'id_estado' =>  5, 'fl_aceita_transgenica' =>  TRUE],
                   ['id_usuario_criacao' => 2068, 'dt_criacao' => 'NOW()', 'id_produto' => 1482, 'id_estado' =>  6, 'fl_aceita_transgenica' =>  TRUE],
                   ['id_usuario_criacao' => 2068, 'dt_criacao' => 'NOW()', 'id_produto' => 1482, 'id_estado' =>  7, 'fl_aceita_transgenica' =>  TRUE],
                   ['id_usuario_criacao' => 2068, 'dt_criacao' => 'NOW()', 'id_produto' => 1482, 'id_estado' =>  8, 'fl_aceita_transgenica' =>  TRUE],
                   ['id_usuario_criacao' => 2068, 'dt_criacao' => 'NOW()', 'id_produto' => 1482, 'id_estado' =>  9, 'fl_aceita_transgenica' =>  TRUE],
                   ['id_usuario_criacao' => 2068, 'dt_criacao' => 'NOW()', 'id_produto' => 1482, 'id_estado' => 10, 'fl_aceita_transgenica' =>  TRUE],
                   ['id_usuario_criacao' => 2068, 'dt_criacao' => 'NOW()', 'id_produto' => 1482, 'id_estado' => 11, 'fl_aceita_transgenica' =>  TRUE],
                   ['id_usuario_criacao' => 2068, 'dt_criacao' => 'NOW()', 'id_produto' => 1482, 'id_estado' => 12, 'fl_aceita_transgenica' =>  TRUE],
                   ['id_usuario_criacao' => 2068, 'dt_criacao' => 'NOW()', 'id_produto' => 1482, 'id_estado' => 13, 'fl_aceita_transgenica' =>  TRUE],
                   ['id_usuario_criacao' => 2068, 'dt_criacao' => 'NOW()', 'id_produto' => 1482, 'id_estado' => 14, 'fl_aceita_transgenica' =>  TRUE],
                   ['id_usuario_criacao' => 2068, 'dt_criacao' => 'NOW()', 'id_produto' => 1482, 'id_estado' => 15, 'fl_aceita_transgenica' =>  TRUE],
                   ['id_usuario_criacao' => 2068, 'dt_criacao' => 'NOW()', 'id_produto' => 1482, 'id_estado' => 16, 'fl_aceita_transgenica' => FALSE],
                   ['id_usuario_criacao' => 2068, 'dt_criacao' => 'NOW()', 'id_produto' => 1482, 'id_estado' => 17, 'fl_aceita_transgenica' =>  TRUE],
                   ['id_usuario_criacao' => 2068, 'dt_criacao' => 'NOW()', 'id_produto' => 1482, 'id_estado' => 18, 'fl_aceita_transgenica' =>  TRUE],
                   ['id_usuario_criacao' => 2068, 'dt_criacao' => 'NOW()', 'id_produto' => 1482, 'id_estado' => 19, 'fl_aceita_transgenica' =>  TRUE],
                   ['id_usuario_criacao' => 2068, 'dt_criacao' => 'NOW()', 'id_produto' => 1482, 'id_estado' => 20, 'fl_aceita_transgenica' =>  TRUE],
                   ['id_usuario_criacao' => 2068, 'dt_criacao' => 'NOW()', 'id_produto' => 1482, 'id_estado' => 21, 'fl_aceita_transgenica' => FALSE],
                   ['id_usuario_criacao' => 2068, 'dt_criacao' => 'NOW()', 'id_produto' => 1482, 'id_estado' => 22, 'fl_aceita_transgenica' =>  TRUE],
                   ['id_usuario_criacao' => 2068, 'dt_criacao' => 'NOW()', 'id_produto' => 1482, 'id_estado' => 23, 'fl_aceita_transgenica' =>  TRUE],
                   ['id_usuario_criacao' => 2068, 'dt_criacao' => 'NOW()', 'id_produto' => 1482, 'id_estado' => 24, 'fl_aceita_transgenica' => FALSE],
                   ['id_usuario_criacao' => 2068, 'dt_criacao' => 'NOW()', 'id_produto' => 1482, 'id_estado' => 25, 'fl_aceita_transgenica' => FALSE],
                   ['id_usuario_criacao' => 2068, 'dt_criacao' => 'NOW()', 'id_produto' => 1482, 'id_estado' => 26, 'fl_aceita_transgenica' =>  TRUE],
                   ['id_usuario_criacao' => 2068, 'dt_criacao' => 'NOW()', 'id_produto' => 1482, 'id_estado' => 27, 'fl_aceita_transgenica' =>  TRUE],
                   ['id_usuario_criacao' => 2068, 'dt_criacao' => 'NOW()', 'id_produto' => 1482, 'id_estado' => 39, 'fl_aceita_transgenica' =>  TRUE]
        ];
        $table->insert($rows)
              ->save();
    }

    public function down(): void
    {
        $delete = $this->getQueryBuilder();
        $delete->delete('produto.aceitacao_variedade_transgenica')
               ->where(['id_produto' => 1482])
               ->execute();
        
        $delete = $this->getQueryBuilder();
        $delete->delete('produto.aceitacao_variedade_transgenica')
               ->where(['fl_aceita_transgenica' => 'FALSE'])
               ->execute();

        $this->execute('ALTER TABLE produto.aceitacao_variedade_transgenica DROP CONSTRAINT "PK_aceitacao_transgenica"');
        $this->execute('ALTER TABLE produto.aceitacao_variedade_transgenica ADD  CONSTRAINT "PK_aceitacao_transgenica" PRIMARY KEY (id_produto, id_estado)');

        $table = $this->table('produto.aceitacao_variedade_transgenica');
        $table->removeColumn('fl_aceita_transgenica')
              ->save();
    }
}
