<?php
declare(strict_types=1);

use Phinx\Migration\AbstractMigration;

final class TaskInc48286 extends AbstractMigration
{
    public function up(): void
    {
        $table = $this->table('manutencao.insere_proponente');
        $rows = [
                    ['nome' => 'JOAO FRANCISCO ROLIM CANHA            ', 'tipo' => 'PF', 'documento' => '08441201978'    , 'sexo' => 'M'],
                    ['nome' => 'BERNARDO TE VAARWERK	              ', 'tipo' => 'PF', 'documento' => '09928373914'    , 'sexo' => 'M'],
                    ['nome' => 'BRUNO KOMORI TONON	                  ', 'tipo' => 'PF', 'documento' => '04137393923'    , 'sexo' => 'M'],
                    ['nome' => 'WESLEY QUEIROZ KAPPKE	              ', 'tipo' => 'PF', 'documento' => '02134933909'    , 'sexo' => 'M'],
                    ['nome' => 'PAULO ANTONIO PUSCH BERTOLINI	      ', 'tipo' => 'PF', 'documento' => '61915815991'    , 'sexo' => 'M'],
                    ['nome' => 'THIAGO JACOB DE JAGER                 ', 'tipo' => 'PF', 'documento' => '08177438980'    , 'sexo' => 'M'],
                    ['nome' => 'MARCOS KUSDRA                         ', 'tipo' => 'PF', 'documento' => '02980929999'    , 'sexo' => 'M'],
                    ['nome' => 'HENRIETTE ANDREA DE BOER              ', 'tipo' => 'PF', 'documento' => '02632588901'    , 'sexo' => 'F'],
                    ['nome' => 'LUIS HITOSHI KATO                     ', 'tipo' => 'PF', 'documento' => '42236036809'    , 'sexo' => 'M'],
                    ['nome' => 'MARCUS ANGELO TONON PUCCI             ', 'tipo' => 'PF', 'documento' => '81455941972'    , 'sexo' => 'M'],
                    ['nome' => 'ISRAEL FRANCISCO FANHA                ', 'tipo' => 'PF', 'documento' => '00624826961'    , 'sexo' => 'M'],
                    ['nome' => 'MARCELO DI FIORI RIBEIRO COSTA        ', 'tipo' => 'PF', 'documento' => '12745678825'    , 'sexo' => 'M'],
                    ['nome' => 'MATHEUS SIMEI WOMMER SOSCHINSKE       ', 'tipo' => 'PF', 'documento' => '10455516944'    , 'sexo' => 'M'],
                    ['nome' => 'CONRADO FILHO E NETO                  ', 'tipo' => 'PF', 'documento' => '11826440909'    , 'sexo' => 'M'],
                    ['nome' => 'GILMAR DE JESUS SOUZA GOMES           ', 'tipo' => 'PF', 'documento' => '04016634938'    , 'sexo' => 'M'],
                    ['nome' => 'ANDRE LUIZ VIANNA CLEMENTI            ', 'tipo' => 'PF', 'documento' => '04933386919'    , 'sexo' => 'M'],
                    ['nome' => 'JOAO CARLOS FUCKS                     ', 'tipo' => 'PF', 'documento' => '32295745837'    , 'sexo' => 'M'],
                    ['nome' => 'PEDRO GONCALVES DE MACEDO             ', 'tipo' => 'PF', 'documento' => '61631515934'    , 'sexo' => 'M'],
                    ['nome' => 'MARCELO GIACOMELLI SALLUM             ', 'tipo' => 'PF', 'documento' => '11008192821'    , 'sexo' => 'M'],
                    ['nome' => 'LAURO CESAR FERREIRA DA SILVA         ', 'tipo' => 'PF', 'documento' => '90050185934'    , 'sexo' => 'M'],
                    ['nome' => 'PAULA RIBAS SENFF                     ', 'tipo' => 'PF', 'documento' => '10186394977'    , 'sexo' => 'F'],
                    ['nome' => 'MAURICIO MENARIM                      ', 'tipo' => 'PF', 'documento' => '91647894972'    , 'sexo' => 'M'],
                    ['nome' => 'REGINALDO DE ASSIS SVIERCOSKI         ', 'tipo' => 'PF', 'documento' => '00510427979'    , 'sexo' => 'M'],
                    ['nome' => 'CESAR AUGUSTO LOS DIAS JUNIOR         ', 'tipo' => 'PF', 'documento' => '07386903928'    , 'sexo' => 'M'],
                    ['nome' => 'NILTON ALBERTO GOLTZ                  ', 'tipo' => 'PF', 'documento' => '02208165900'    , 'sexo' => 'M'],
                    ['nome' => 'ADHEMAR VILLELA FILHO                 ', 'tipo' => 'PF', 'documento' => '01486853900'    , 'sexo' => 'M'],
                    ['nome' => 'SILVIO DOS SANTOS FERREIRA            ', 'tipo' => 'PF', 'documento' => '39637131949'    , 'sexo' => 'M'],
                    ['nome' => 'SILVESTRE JOSE RIBEIRO                ', 'tipo' => 'PF', 'documento' => '35311673915'    , 'sexo' => 'M'],
                    ['nome' => 'REINALDO ERVINO RENTZ                 ', 'tipo' => 'PF', 'documento' => '99082071991'    , 'sexo' => 'M'],
                    ['nome' => 'WASHINGTON TADEU TAKEO NISHIYAMA      ', 'tipo' => 'PF', 'documento' => '04216953824'    , 'sexo' => 'M'],
                    ['nome' => 'ITAMAR PRESTES CARNEIRO               ', 'tipo' => 'PF', 'documento' => '62948024900'    , 'sexo' => 'M'],
                    ['nome' => 'TIAGO FERNANDO GOMES ORTIZ            ', 'tipo' => 'PF', 'documento' => '10916949907'    , 'sexo' => 'M'],
                    ['nome' => 'ANTONIO CARLOS ORTIZ JUNIOR           ', 'tipo' => 'PF', 'documento' => '97530077953'    , 'sexo' => 'M'],
                    ['nome' => 'MARCIO WILPERT                        ', 'tipo' => 'PF', 'documento' => '04584826927'    , 'sexo' => 'M'],
                    ['nome' => 'EDEOMAR JACOB                         ', 'tipo' => 'PF', 'documento' => '77933524915'    , 'sexo' => 'M'],
                    ['nome' => 'JOAO MARIA MILCHESKY                  ', 'tipo' => 'PF', 'documento' => '62730207953'    , 'sexo' => 'M'],
                    ['nome' => 'GERT JAN VAN DE RIET                  ', 'tipo' => 'PF', 'documento' => '04992192955'    , 'sexo' => 'M'],
                    ['nome' => 'SILVIO SUTIL DE OLIVEIRA JUNIOR       ', 'tipo' => 'PF', 'documento' => '00458532908'    , 'sexo' => 'M'],
                    ['nome' => 'AGRO PECUARIA T. YAMAMOTO LTDA        ', 'tipo' => 'PJ', 'documento' => '78701232000164' , 'sexo' => 'M'],
                    ['nome' => 'RONALD FERNANDO DE BOER               ', 'tipo' => 'PF', 'documento' => '08209276948'    , 'sexo' => 'M'],
                    ['nome' => 'ALBERT JAN BOUWMAN                    ', 'tipo' => 'PF', 'documento' => '12975827997'    , 'sexo' => 'M'],
                    ['nome' => 'JOAO TEIXEIRA                         ', 'tipo' => 'PF', 'documento' => '05721725915'    , 'sexo' => 'M'],
                    ['nome' => 'CAROLINE EGBERTDINA MORSINK GROENWOLD ', 'tipo' => 'PF', 'documento' => '72632542987'    , 'sexo' => 'F'],
                    ['nome' => 'INSTITUTO PRESBITERIANO MACKENZIE     ', 'tipo' => 'PJ', 'documento' => '60967551002528' , 'sexo' => 'M'],
                    ['nome' => 'JOSMAR CESAR CARNEIRO                 ', 'tipo' => 'PF', 'documento' => '05787469992'    , 'sexo' => 'M'],
                    ['nome' => 'GEISE LETICIA GONZAGA LOMAN           ', 'tipo' => 'PF', 'documento' => '02811576932'    , 'sexo' => 'F'],
                    ['nome' => 'TIAGO VAN DER VINNE                   ', 'tipo' => 'PF', 'documento' => '12630457907'    , 'sexo' => 'M']
        ];
        $table->insert($rows)
              ->save();

        $this->execute("CREATE OR REPLACE FUNCTION manutencao.inserindo_proponente() RETURNS VOID AS $$
                        DECLARE
                            stSQL       VARCHAR;
                            reRecord    RECORD;
                            crCursor    REFCURSOR;
                            inCount     INTEGER;
                        BEGIN
                            inCount := 0;
                            stSQL := '
                                         SELECT LTRIM(tipo, ''P'') AS tipo
                                              , sexo
                                              , nome
                                              , documento
                                              , CASE
                                                    WHEN tipo = ''PF'' THEN
                                                        REGEXP_REPLACE(LPAD(documento,11,''0''), ''([0-9]{3})([0-9]{3})([0-9]{3})([0-9]{2})'', ''\\1.\\2.\\3-\\4'')
                                                    ELSE
                                                        REGEXP_REPLACE(LPAD(documento,14,''0''), ''([0-9]{2})([0-9]{3})([0-9]{3})([0-9]{4})([0-9]{2})'', ''\\1.\\2.\\3/\\4-\\5'')
                                                END AS cpf_cnpj
                                           FROM manutencao.insere_proponente
                                       GROUP BY 1, 2, 3, 4, 5
                                              ;
                                     ';
                                                
                            OPEN crCursor FOR EXECUTE stSQL;
                            LOOP
                                FETCH crCursor INTO reRecord;
                                EXIT WHEN NOT FOUND;

                                RAISE NOTICE '%    DOC: % - %  %', reRecord.tipo, reRecord.cpf_cnpj, reRecord.sexo, reRecord.nome;
                                PERFORM 1
                                   FROM seguro.proponentes
                                  WHERE cpf_cnpj = reRecord.cpf_cnpj
                                      ;
                                IF NOT FOUND THEN
                                    inCount := inCount + 1;
                                    INSERT
                                      INTO seguro.proponentes
                                         ( id_usuario_criacao
                                         , dt_criacao
                                         , ds_sexo
                                         , cpf_cnpj
                                         , ds_nome_proponente
                                         )
                                    VALUES
                                         ( 2530
                                         , NOW()
                                         , reRecord.sexo
                                         , reRecord.cpf_cnpj
                                         , reRecord.nome
                                         );
                                    UPDATE manutencao.insere_proponente
                                       SET count = inCount
                                         , inserido = TRUE
                                     WHERE documento = reRecord.documento
                                         ;
                                    RAISE NOTICE 'COUNT: %', inCount;
                                ELSE
                                    RAISE NOTICE 'NAO INSERE ----------------------- % - %', reRecord.cpf_cnpj, reRecord.nome;
                                    UPDATE manutencao.insere_proponente
                                       SET inserido = FALSE
                                     WHERE documento = reRecord.documento
                                         ;
                                END IF;
                            END LOOP;
                            CLOSE crCursor;
                        END;
                        $$ LANGUAGE 'plpgsql';
            ");

        $this->execute("SELECT manutencao.inserindo_proponente()");
    }

    public function down(): void
    {
        $this->execute("CREATE OR REPLACE FUNCTION manutencao.remove_proponente() RETURNS VOID AS $$
                        DECLARE
                            stSQL       VARCHAR;
                            reRecord    RECORD;
                            crCursor    REFCURSOR;
                            inCount     INTEGER;
                        BEGIN
                            stSQL := '
                                         SELECT LTRIM(tipo, ''P'') AS tipo
                                              , sexo
                                              , nome
                                              , documento
                                              , CASE
                                                    WHEN tipo = ''PF'' THEN
                                                        REGEXP_REPLACE(LPAD(documento,11,''0''), ''([0-9]{3})([0-9]{3})([0-9]{3})([0-9]{2})'', ''\\1.\\2.\\3-\\4'')
                                                    ELSE
                                                        REGEXP_REPLACE(LPAD(documento,14,''0''), ''([0-9]{2})([0-9]{3})([0-9]{3})([0-9]{4})([0-9]{2})'', ''\\1.\\2.\\3/\\4-\\5'')
                                                END AS cpf_cnpj
                                           FROM manutencao.insere_proponente
                                          WHERE inserido = TRUE
                                       GROUP BY 1, 2, 3, 4, 5
                                              ;
                                     ';
                                                
                            OPEN crCursor FOR EXECUTE stSQL;
                            LOOP
                                FETCH crCursor INTO reRecord;
                                EXIT WHEN NOT FOUND;

                                RAISE NOTICE '%    DOC: % - %  %', reRecord.tipo, reRecord.cpf_cnpj, reRecord.sexo, reRecord.nome;
                                    DELETE
                                      FROM seguro.proponentes
                                     WHERE cpf_cnpj = reRecord.cpf_cnpj
                                         ;

                                    UPDATE manutencao.insere_proponente
                                       SET inserido = FALSE
                                     WHERE documento = reRecord.documento
                                         ;
                            END LOOP;
                            CLOSE crCursor;
                        END;
                        $$ LANGUAGE 'plpgsql';
            ");

        $this->execute("SELECT manutencao.remove_proponente()");
    }
}
