<?php
declare(strict_types=1);

use Phinx\Migration\AbstractMigration;

final class Task04250 extends AbstractMigration
{
    public function up(): void
    {
        $this->execute("CREATE TABLE sinistro.processos_notas_fiscais (
                            id SERIAL,
                            id_processo INTEGER NOT NULL,
                            id_status_arquivo INTEGER NOT NULL,
                            id_status INTEGER NULL,
                        
                            CONSTRAINT pk_processos_notas_fiscais PRIMARY KEY (id),
                            CONSTRAINT fk_processos_notas_fiscais FOREIGN KEY (id_processo) 
                                REFERENCES sinistro.processos (id),
                            CONSTRAINT fk_status_arquivo_processos_notas_fiscais FOREIGN KEY (id_status_arquivo)
                                REFERENCES sistema.status (id),
                            CONSTRAINT fk_status_processos_notas_fiscais FOREIGN KEY (id_status)
                                REFERENCES sistema.status (id)
                        )
                        INHERITS (public.campos_default)
        ");

        $this->execute("CREATE TABLE sinistro.notas_fiscais (
                            id SERIAL,
                            id_processos_notas_fiscais INTEGER NOT NULL,
                            id_cooperativa INTEGER NOT NULL,
                            ds_nro_nota_fiscal VARCHAR(30) NOT NULL,
                            vl_peso NUMERIC(12,2) NOT NULL,
                            vl_percent_germinacao NUMERIC(5,2) NOT NULL,
                            vl_percent_desvalorizacao NUMERIC(5,2) NOT NULL,
                        
                            CONSTRAINT pk_notas_fiscais PRIMARY KEY (id),
                            CONSTRAINT fk_processos_notas_fiscais FOREIGN KEY (id_processos_notas_fiscais)
                                REFERENCES sinistro.processos_notas_fiscais (id),
                            CONSTRAINT fk_cooperativas_notas_fiscais FOREIGN KEY (id_cooperativa)
                                REFERENCES sistema.cooperativas (id)
                        )
                        INHERITS (public.campos_default)
        ");

        $this->execute("CREATE TABLE sinistro.notas_fiscais_arquivos (
                            id SERIAL,
                            id_processos_notas_fiscais INTEGER NOT NULL,
                            ds_nome_arquivo VARCHAR(30) NOT NULL,
                        
                            CONSTRAINT pk_notas_fiscais_arquivos PRIMARY KEY (id),
                            CONSTRAINT fk_processos_notas_fiscais_arquivos FOREIGN KEY (id_processos_notas_fiscais) 
                                REFERENCES sinistro.processos_notas_fiscais (id)
                        )
                        INHERITS (public.campos_default)
        ");

        $this->execute("CREATE TABLE sinistro.historico_processos_notas_fiscais (
                            id SERIAL,
                            id_processos_notas_fiscais INTEGER NOT NULL,
                            ds_historico VARCHAR(80) NOT NULL,
                        
                            CONSTRAINT pk_historico_processos_notas_fiscais PRIMARY KEY (id),
                            CONSTRAINT fk_historico_processos_notas_fiscais FOREIGN KEY (id_processos_notas_fiscais) 
                                REFERENCES sinistro.processos_notas_fiscais (id)
                        )
                        INHERITS (public.campos_default);        
        ");

        $this->execute("CREATE OR REPLACE VIEW sinistro.v_processo_sinistro
                            AS
                            SELECT DISTINCT pr.id,
                            pr.id_processo_seguradora,
                            pr.id_status,
                            st.ds_chave AS ds_chave_status,
                            st.ds_status,
                            pr.id_status_arquivos,
                            sta.ds_chave AS ds_chave_status_arquivos,
                            sta.ds_status AS ds_status_arquivos,
                            pr.dt_criacao AS dt_criacao_processo,
                            pr.fl_ativo,
                            pr.fl_del,
                            pr.fl_pasta_aberta,
                            emp.id AS id_empresa,
                            emp.ds_nome_fantasia AS ds_empresa_vistoriadora,
                            p.id AS id_proposta,
                            p.nr_apolice,
                            pp.ds_nome_proponente,
                            pc.id_usuario AS id_corretor,
                            m.id AS id_municipio,
                            m.ds_nome_municipio,
                            e.id AS id_estado,
                            e.ds_nome_estado,
                            prod.id AS id_produto,
                            prod.ds_nome_produto,
                            prod.id_safra,
                            c.id AS id_cultura,
                            c.ds_chave_cultura,
                            u.ds_nome_usuario AS ds_nome_usuario_responsavel_liquidacao,
                            pr.dt_alteracao AS dt_alteracao_processo,
                            pe.id_endosso,
                                CASE
                                    WHEN v_nr_endosso.nr_endosso > 0 THEN v_nr_endosso.nr_endosso
                                    ELSE 0::bigint
                                END AS nr_endosso,
                            v_id_proposta_mae.id_proposta_mae,
                            p.id_proposta_endossada,
                            v_id_proposta_mae_completo.chave_mae AS id_proposta_mae_completo,
                            pr.fl_ressegurador,
                            pnf.id AS id_processos_notas_fiscais
                            FROM seguro.propostas_endosso pe
                                JOIN seguro.propostas p ON p.id = pe.id_proposta AND pe.fl_proposta_vigente = true
                                JOIN sinistro.processos pr ON pr.id_proposta = p.id
                                LEFT JOIN sistema.usuarios u ON u.id = pr.id_usuario_responsavel_liquidacao
                                LEFT JOIN sinistro.processos_empresas pemp ON pemp.id_processo = pr.id AND pemp.fl_ativo = true
                                LEFT JOIN sistema.empresas emp ON emp.id = pemp.id_empresa
                                JOIN sistema.status st ON st.id = pr.id_status
                                JOIN sistema.status sta ON sta.id = pr.id_status_arquivos
                                JOIN seguro.propostas_proponentes pp ON pp.id_proposta = p.id
                                JOIN seguro.propostas_propriedades ppr ON ppr.id_proposta = p.id
                                JOIN produto.produtos prod ON prod.id = p.id_produto
                                JOIN produto.produtos_geral pg ON pg.id = prod.id_produto_geral
                                JOIN produto.culturas c ON c.id = pg.id_cultura
                                JOIN seguro.propostas_corretores pc ON pc.id_proposta = p.id
                                JOIN sistema.municipios m ON m.id = ppr.id_municipio
                                JOIN sistema.estados e ON e.id = m.id_estado
                                LEFT JOIN seguro.v_nr_endosso ON v_nr_endosso.id_endosso = p.id_endosso
                                LEFT JOIN seguro.v_id_proposta_mae ON v_id_proposta_mae.id_proposta = p.id_proposta_mae
                                LEFT JOIN seguro.v_id_proposta_mae_completo ON v_id_proposta_mae_completo.id_proposta = p.id_proposta_mae
                                LEFT JOIN sinistro.processos_notas_fiscais pnf ON pr.id = pnf.id_processo
                            ORDER BY pr.id, pr.id_processo_seguradora, pr.id_status, st.ds_chave, st.ds_status, pr.id_status_arquivos, sta.ds_chave, sta.ds_status, pr.dt_criacao, pr.fl_ativo, pr.fl_del, pr.fl_pasta_aberta, emp.id, emp.ds_nome_fantasia, p.id, p.nr_apolice, pp.ds_nome_proponente, pc.id_usuario, m.id, m.ds_nome_municipio, e.id, e.ds_nome_estado, prod.id, prod.ds_nome_produto, prod.id_safra, c.id, c.ds_chave_cultura, u.ds_nome_usuario, pr.dt_alteracao, pe.id_endosso, p.id_proposta_endossada, pr.fl_ressegurador, pnf.id
        ");

        $this->execute("INSERT INTO sistema.tipo_status (ds_tipo_status, ds_chave) VALUES ('Sinistro Notas Fiscais', 'NOTAS_FISCAIS')");

        $this->execute("INSERT INTO sistema.status (
                            ds_status, 
                            cd_status, 
                            ds_chave, 
                            id_tipo_status
                        ) VALUES (
                            'Não enviada', 
                            1, 
                            'NAO_ENVIADA', 
                            (SELECT id FROM sistema.tipo_status WHERE ds_chave = 'NOTAS_FISCAIS'))"
        );

        $this->execute("INSERT INTO sistema.status (
                            ds_status, 
                            cd_status, 
                            ds_chave, 
                            id_tipo_status
                        ) VALUES (
                            'Aguardando envio', 
                            2, 
                            'AGUARDANDO_ENVIO', 
                            (SELECT id FROM sistema.tipo_status WHERE ds_chave = 'NOTAS_FISCAIS'))"
        );

        $this->execute("INSERT INTO sistema.status (
                            ds_status, 
                            cd_status, 
                            ds_chave, 
                            id_tipo_status
                        ) VALUES (
                            'Enviada', 
                            3, 
                            'ENVIADA', 
                            (SELECT id FROM sistema.tipo_status WHERE ds_chave = 'NOTAS_FISCAIS'))"
        );

        $this->execute("INSERT INTO sistema.acao (
                            ds_label, 
                            ds_module, 
                            ds_controller, 
                            ds_action, 
                            ds_param, 
                            id_parent, 
                            ds_image, 
                            ds_descricao, 
                            fl_tipo,
                            id 
                        ) VALUES (
                            'Enviar Notas Fiscais', 
                            'corretor', 
                            'processo', 
                            'uploadnota', 
                            '', 
                            1105, 
                            '', 
                            'Enviar Notas Fiscais', 
                            'A', 
                            nextval('sistema.acao_id_seq'::regclass))
        ");
        
        $this->execute("INSERT INTO sistema.acao (
                            ds_label, 
                            ds_module, 
                            ds_controller, 
                            ds_action, 
                            ds_param, 
                            id_parent, 
                            ds_image, 
                            ds_descricao, 
                            fl_tipo, 
                            id
                        ) VALUES (
                            'Digitar Notas Fiscais', 
                            'sinistro2', 
                            'processo', 
                            'digitarnotasfiscais', 
                            '', 
                            1597, 
                            '', 
                            'Digitar Notas Fiscais', 
                            'A', 
                            nextval('sistema.acao_id_seq'::regclass))
        ");

        $this->execute("INSERT INTO sistema.acao (
                            ds_label, 
                            ds_module, 
                            ds_controller, 
                            ds_action, 
                            ds_param, 
                            id_parent, 
                            ds_image, 
                            ds_descricao, 
                            fl_tipo, 
                            id
                        ) VALUES (
                            'Excluir Observação Notas Fiscais', 
                            'sinistro2',
                            'processo', 
                            'deleteobservacaonotasfiscais', 
                            '', 
                            1597, 
                            '', 
                            'Excluir Observação Notas Fiscais', 
                            'A',
                            nextval('sistema.acao_id_seq'::regclass))
        "); 

        $this->execute("INSERT INTO sistema.acao (
                            ds_label, 
                            ds_module, 
                            ds_controller, 
                            ds_action, 
                            ds_param, 
                            id_parent, 
                            ds_image, 
                            ds_descricao, 
                            fl_tipo, 
                            id
                        ) VALUES (
                            'Salvar Observação Notas Fiscais', 
                            'sinistro2', 
                            'processo', 
                            'saveobservacaonotasfiscais',
                            '',
                            1597,
                            '',
                            'Salvar Observação Notas Fiscais',
                            'A',
                            nextval('sistema.acao_id_seq'::regclass))
        ");

        $this->execute("INSERT INTO sistema.acao (
                            ds_label, 
                            ds_module, 
                            ds_controller, 
                            ds_action, 
                            ds_param, 
                            id_parent, 
                            ds_image, 
                            ds_descricao, 
                            fl_tipo, 
                            id
                        ) VALUES (
                            'Editar Nota Fiscal', 
                            'sinistro2', 
                            'processo', 
                            'editarnotafiscal', 
                            '', 
                            1597, 
                            '', 
                            'Editar Nota Fiscal', 
                            'A', 
                            nextval('sistema.acao_id_seq'::regclass))
        ");

        $this->execute("INSERT INTO sistema.acao (
                            ds_label, 
                            ds_module, 
                            ds_controller, 
                            ds_action, 
                            ds_param, 
                            id_parent, 
                            ds_image, 
                            ds_descricao, 
                            fl_tipo, 
                            id
                        ) VALUES (
                            'Deletar Nota Fiscal', 
                            'sinistro2', 
                            'processo', 
                            'deletarnotafiscal', 
                            '', 
                            1597, 
                            '', 
                            'Deletar Nota Fiscal', 
                            'A', 
                            nextval('sistema.acao_id_seq'::regclass))
        ");

        $this->execute("CREATE TABLE sinistro.percent_cobertura_germinacao_desvalorizacao (
                            id SERIAL,
                            id_cobertura INTEGER NOT NULL,
                            ds_nome_categoria VARCHAR(50) NOT NULL,
                            vl_percent_germinacao_min NUMERIC(5,2) NOT NULL,
                            vl_percent_germinacao_max NUMERIC(5,2) NOT NULL,
                            vl_percent_desvalorizacao NUMERIC(5,2) NOT NULL,
            
                            CONSTRAINT pk_percent_cobertura_germinacao_desvalorizacao PRIMARY KEY (id),
                            CONSTRAINT fk_coberturas_percent_cobertura FOREIGN KEY (id_cobertura) 
                                REFERENCES produto.coberturas (id)
                        )
                        INHERITS (public.campos_default);
        ");

        $this->execute("INSERT INTO sinistro.percent_cobertura_germinacao_desvalorizacao (
                            id_cobertura,
                            ds_nome_categoria,
                            vl_percent_germinacao_min,
                            vl_percent_germinacao_max,
                            vl_percent_desvalorizacao
                        ) VALUES (
                            40,
                            'Cevada Forrageira',
                            0,
                            89.99,
                            50
                        )
        ");

        $this->execute("INSERT INTO sinistro.percent_cobertura_germinacao_desvalorizacao (
                            id_cobertura,
                            ds_nome_categoria,
                            vl_percent_germinacao_min,
                            vl_percent_germinacao_max,
                            vl_percent_desvalorizacao
                        ) VALUES (
                            40,
                            'Cevada Fora do Padrão',
                            90.00,
                            91.99,
                            10
                        )
        ");
        
        $this->execute("INSERT INTO sinistro.percent_cobertura_germinacao_desvalorizacao (
                            id_cobertura,
                            ds_nome_categoria,
                            vl_percent_germinacao_min,
                            vl_percent_germinacao_max,
                            vl_percent_desvalorizacao
                        ) VALUES (
                            40,
                            'Cevada Indústria',
                            92,
                            100,
                            0
                        )
        ");
        
        $this->execute("INSERT INTO sinistro.percent_cobertura_germinacao_desvalorizacao (
                            id_cobertura,
                            ds_nome_categoria,
                            vl_percent_germinacao_min,
                            vl_percent_germinacao_max,
                            vl_percent_desvalorizacao
                        ) VALUES (
                            33,
                            'Cevada Forrageira',
                            0,
                            91.99,
                            50
                        )
        ");
        
        $this->execute("INSERT INTO sinistro.percent_cobertura_germinacao_desvalorizacao (
                            id_cobertura,
                            ds_nome_categoria,
                            vl_percent_germinacao_min,
                            vl_percent_germinacao_max,
                            vl_percent_desvalorizacao
                        ) VALUES (
                            33,
                            'Cevada Fora do Padrão',
                            92.00,
                            94.99,
                            10
                        )
        ");
        
        $this->execute("INSERT INTO sinistro.percent_cobertura_germinacao_desvalorizacao (
                            id_cobertura,
                            ds_nome_categoria,
                            vl_percent_germinacao_min,
                            vl_percent_germinacao_max,
                            vl_percent_desvalorizacao
                        ) VALUES (
                            33,
                            'Cevada Indústria',
                            95,
                            100,
                            0
                        )
        ");

        $this->execute("INSERT INTO sistema.tipo_status (
                            ds_tipo_status, 
                            ds_chave
                        ) VALUES (
                            'Sinistro Notas Fiscais Digitação', 
                            'NOTAS_FISCAIS_DIGITACAO'
                        )
        ");

        $this->execute("INSERT INTO sistema.status (
                            ds_status, 
                            cd_status, 
                            ds_chave, 
                            id_tipo_status
                        ) VALUES (
                            'Não digitada', 
                            1, 
                            'NAO_DIGITADA', 
                            (SELECT id FROM sistema.tipo_status WHERE ds_chave = 'NOTAS_FISCAIS_DIGITACAO')
                        )
        ");
            
        $this->execute("INSERT INTO sistema.status (
                            ds_status, 
                            cd_status, 
                            ds_chave, 
                            id_tipo_status
                        ) VALUES (
                            'Digitando', 
                            2, 
                            'DIGITANDO', 
                            (SELECT id FROM sistema.tipo_status WHERE ds_chave = 'NOTAS_FISCAIS_DIGITACAO')
                        )
        ");

        $this->execute("INSERT INTO sistema.status (
                            ds_status, 
                            cd_status, 
                            ds_chave, 
                            id_tipo_status
                        ) VALUES (
                            'Digitada', 
                            3, 
                            'DIGITADA', 
                            (SELECT id FROM sistema.tipo_status WHERE ds_chave = 'NOTAS_FISCAIS_DIGITACAO')
                        )
        ");
    }

    public function down(): void
    {
        $this->execute("DROP VIEW sinistro.v_processo_sinistro");

        $this->execute("CREATE OR REPLACE VIEW sinistro.v_processo_sinistro
                            AS
                            SELECT DISTINCT pr.id,
                            pr.id_processo_seguradora,
                            pr.id_status,
                            st.ds_chave AS ds_chave_status,
                            st.ds_status,
                            pr.id_status_arquivos,
                            sta.ds_chave AS ds_chave_status_arquivos,
                            sta.ds_status AS ds_status_arquivos,
                            pr.dt_criacao AS dt_criacao_processo,
                            pr.fl_ativo,
                            pr.fl_del,
                            pr.fl_pasta_aberta,
                            emp.id AS id_empresa,
                            emp.ds_nome_fantasia AS ds_empresa_vistoriadora,
                            p.id AS id_proposta,
                            p.nr_apolice,
                            pp.ds_nome_proponente,
                            pc.id_usuario AS id_corretor,
                            m.id AS id_municipio,
                            m.ds_nome_municipio,
                            e.id AS id_estado,
                            e.ds_nome_estado,
                            prod.id AS id_produto,
                            prod.ds_nome_produto,
                            prod.id_safra,
                            c.id AS id_cultura,
                            c.ds_chave_cultura,
                            u.ds_nome_usuario AS ds_nome_usuario_responsavel_liquidacao,
                            pr.dt_alteracao AS dt_alteracao_processo,
                            pe.id_endosso,
                                CASE
                                    WHEN v_nr_endosso.nr_endosso > 0 THEN v_nr_endosso.nr_endosso
                                    ELSE 0::bigint
                                END AS nr_endosso,
                            v_id_proposta_mae.id_proposta_mae,
                            p.id_proposta_endossada,
                            v_id_proposta_mae_completo.chave_mae AS id_proposta_mae_completo,
                            pr.fl_ressegurador
                            FROM seguro.propostas_endosso pe
                                JOIN seguro.propostas p ON p.id = pe.id_proposta AND pe.fl_proposta_vigente = true
                                JOIN sinistro.processos pr ON pr.id_proposta = p.id
                                LEFT JOIN sistema.usuarios u ON u.id = pr.id_usuario_responsavel_liquidacao
                                LEFT JOIN sinistro.processos_empresas pemp ON pemp.id_processo = pr.id AND pemp.fl_ativo = true
                                LEFT JOIN sistema.empresas emp ON emp.id = pemp.id_empresa
                                JOIN sistema.status st ON st.id = pr.id_status
                                JOIN sistema.status sta ON sta.id = pr.id_status_arquivos
                                JOIN seguro.propostas_proponentes pp ON pp.id_proposta = p.id
                                JOIN seguro.propostas_propriedades ppr ON ppr.id_proposta = p.id
                                JOIN produto.produtos prod ON prod.id = p.id_produto
                                JOIN produto.produtos_geral pg ON pg.id = prod.id_produto_geral
                                JOIN produto.culturas c ON c.id = pg.id_cultura
                                JOIN seguro.propostas_corretores pc ON pc.id_proposta = p.id
                                JOIN sistema.municipios m ON m.id = ppr.id_municipio
                                JOIN sistema.estados e ON e.id = m.id_estado
                                LEFT JOIN seguro.v_nr_endosso ON v_nr_endosso.id_endosso = p.id_endosso
                                LEFT JOIN seguro.v_id_proposta_mae ON v_id_proposta_mae.id_proposta = p.id_proposta_mae
                                LEFT JOIN seguro.v_id_proposta_mae_completo ON v_id_proposta_mae_completo.id_proposta = p.id_proposta_mae
                            ORDER BY pr.id, pr.id_processo_seguradora, pr.id_status, st.ds_chave, st.ds_status, pr.id_status_arquivos, sta.ds_chave, sta.ds_status, pr.dt_criacao, pr.fl_ativo, pr.fl_del, pr.fl_pasta_aberta, emp.id, emp.ds_nome_fantasia, p.id, p.nr_apolice, pp.ds_nome_proponente, pc.id_usuario, m.id, m.ds_nome_municipio, e.id, e.ds_nome_estado, prod.id, prod.ds_nome_produto, prod.id_safra, c.id, c.ds_chave_cultura, u.ds_nome_usuario, pr.dt_alteracao, pe.id_endosso, p.id_proposta_endossada, pr.fl_ressegurador"
        );


        $this->table("sinistro.historico_processos_notas_fiscais")->drop()->save();

        $this->table("sinistro.notas_fiscais")->drop()->save();

        $this->table("sinistro.notas_fiscais_arquivos")->drop()->save();

        $this->table("sinistro.processos_notas_fiscais")->drop()->save();
        
        $this->execute("DELETE FROM sistema.status
                         WHERE id_tipo_status = (
                                SELECT id 
                                  FROM sistema.tipo_status
                                 WHERE ds_tipo_status = 'Sinistro Notas Fiscais'
                                   AND ds_chave = 'NOTAS_FISCAIS'
                                )"
        );

        $this->execute("DELETE FROM sistema.tipo_status 
                         WHERE ds_tipo_status = 'Sinistro Notas Fiscais' 
                           AND ds_chave = 'NOTAS_FISCAIS'"
        );

        $this->execute("DELETE FROM sistema.acao
                         WHERE ds_action = 'uploadnota'
                           AND id_parent = 1105"
        );

        
        $this->execute("DELETE FROM sistema.acao
                         WHERE ds_action = 'digitarnotasfiscais'
                           AND id_parent = 1597"
        );

        $this->execute("DELETE FROM sistema.acao
                         WHERE ds_action = 'deleteobservacaonotasfiscais'
                           AND id_parent = 1597"
        );

        $this->execute("DELETE FROM sistema.acao
                         WHERE ds_action = 'saveobservacaonotasfiscais'
                           AND id_parent = 1597"
        );

        $this->execute("DELETE FROM sistema.acao
                         WHERE ds_action = 'editarnotafiscal'
                           AND id_parent = 1597
        ");

        $this->execute("DELETE FROM sistema.acao
                         WHERE ds_action = 'deletarnotafiscal'
                           AND id_parent = 1597
        ");

        $this->table("sinistro.percent_cobertura_germinacao_desvalorizacao")->drop()->save();

        $this->execute("DELETE FROM sistema.status
                         WHERE id_tipo_status = (
                                SELECT id 
                                    FROM sistema.tipo_status
                                    WHERE ds_tipo_status = 'Sinistro Notas Fiscais Digitação'
                                    AND ds_chave = 'NOTAS_FISCAIS_DIGITACAO'
                               )
        ");

        $this->execute("DELETE FROM sistema.tipo_status 
                         WHERE ds_tipo_status = 'Sinistro Notas Fiscais Digitação' 
                           AND ds_chave = 'NOTAS_FISCAIS_DIGITACAO'
        ");

    }
}
