<?php
declare(strict_types=1);

use Phinx\Migration\AbstractMigration;

final class Task2304281353 extends AbstractMigration
{
    public function up(): void
    {
        $this->execute("DROP VIEW sinistro.v_laudos_cobranca_previa");

        $this->upViewLaudosCobrancaPrevia();
    }

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

        $this->downViewLaudosCobrancaPrevia();
    }

    private function upViewLaudosCobrancaPrevia(): void
    {
          $this->execute(<<<SQL
            CREATE OR REPLACE VIEW sinistro.v_laudos_cobranca_previa AS
                SELECT p.id AS id_proposta,
                       v_id_proposta_mae.id_proposta_mae,
                       pvp.id_vistoria,
                       prc.id AS id_processo,
                       prc.id_processo_seguradora,
                       pvp.id AS id_proposta_vistoria,
                       prop.ds_nome_proponente,
                       pd.ds_nome_abreviado,
                       m.ds_nome_municipio,
                       e.ds_sigla,
                       e.id AS id_estado,
                       emp.ds_nome_fantasia,
                       emp.id AS id_empresa,
                       'Previa'::text AS tp_vistoria,
                       pg.id_tipo_produto,
                       cu.id AS id_cultura,
                       cu.ds_nome_cultura,
                       c.id AS id_cobertura,
                       fu.ds_nome_funcionario AS perito,
                       fu.id AS id_perito,
                       to_char(pvp.dt_laudo, 'YYYY-MM-DD HH24:MI:SS'::text) AS dt_vistoria,
                       to_char(pvp.dt_laudo, 'DD/MM/YYYY'::text) AS dt_laudo,
                       pvp.dt_laudo AS dt_laudo_order,
                       sf.ds_chave AS ds_safra,
                       c.ds_chave_cobertura,
                       pd.id_seguradora,
                       pd.id_safra,
                       sf.ds_nome_safra,
                       emp.cpf_cnpj AS cpf_cnpj_empresa,
                       p.nr_apolice,
                       em.ds_nome_municipio AS ds_nome_municipio_empresa,
                       ee.ds_sigla AS ds_sigla_uf_empresa,
                       (COALESCE(fm.ds_nome_municipio::character varying, 'NAO INFORMADO'::character varying)::text || '/'::text) || COALESCE(fe.ds_sigla, '-'::bpchar)::text AS municipio_perito,
                       m.id AS id_municipio,
                       to_char(p.dt_criacao::timestamp with time zone, 'YYYY-MM-DD'::text) AS data_criacao_proposta
                  FROM seguro.propostas_endosso ped
                    JOIN seguro.propostas p ON ped.id_proposta = p.id
                    JOIN seguro.propostas_coberturas pc ON pc.id_proposta = p.id AND pc.fl_principal = true
                    JOIN produto.coberturas c ON c.id = pc.id_cobertura
                    JOIN produto.produtos pd ON pd.id = p.id_produto AND pd.id_safra >= ((SELECT safras.id - 1 FROM produto.safras WHERE safras.fl_vigente = true))
                    JOIN produto.safras sf ON sf.id = pd.id_safra
                    JOIN produto.produtos_geral pg ON pg.id = pd.id_produto_geral
                    JOIN produto.culturas cu ON cu.id = pg.id_cultura
                    LEFT JOIN sinistro.processos prc ON prc.id_proposta = p.id
                    JOIN seguro.propostas_propriedades pp ON p.id = pp.id_proposta
                    JOIN seguro.propostas_proponentes prop ON p.id = prop.id_proposta
                    JOIN sistema.municipios m ON pp.id_municipio = m.id
                    JOIN sistema.estados e ON m.id_estado = e.id
                    JOIN seguro.propostas_vistorias_previas pvp ON p.id = pvp.id_proposta AND pvp.fl_transmitido = true AND pvp.fl_nova_vistoria_custo_perito IS NOT TRUE
                    LEFT JOIN sistema.vistorias_agendamentos va ON va.id_vistoria = pvp.id_vistoria
                    LEFT JOIN sistema.agendamentos_funcionarios af ON af.id_agendamento = va.id_agendamento
                    LEFT JOIN sistema.funcionarios fu ON fu.id = af.id_funcionario
                    JOIN sistema.vistorias_empresas vemp ON pvp.id_vistoria = vemp.id_vistoria AND vemp.fl_ativo = true
                    JOIN sistema.empresas emp ON vemp.id_empresa = emp.id
                    LEFT JOIN seguro.v_id_proposta_mae ON v_id_proposta_mae.id_proposta = p.id_proposta_mae
                    LEFT JOIN sistema.municipios em ON em.id = emp.id_municipio
                    LEFT JOIN sistema.estados ee ON ee.id = em.id_estado
                    LEFT JOIN sistema.municipios fm ON fm.id = fu.id_municipio
                    LEFT JOIN sistema.estados fe ON fe.id = fm.id_estado
                ORDER BY (to_char(pvp.dt_laudo, 'DD/MM/YYYY'::text));

SQL
        );

    }

    private function downViewLaudosCobrancaPrevia(): void
    {
        $this->execute(<<<SQL
            CREATE OR REPLACE VIEW sinistro.v_laudos_cobranca_previa AS
                SELECT p.id AS id_proposta,
                       v_id_proposta_mae.id_proposta_mae,
                       pvp.id_vistoria,
                       prc.id AS id_processo,
                       prc.id_processo_seguradora,
                       pvp.id AS id_proposta_vistoria,
                       prop.ds_nome_proponente,
                       pd.ds_nome_abreviado,
                       m.ds_nome_municipio,
                       e.ds_sigla,
                       e.id AS id_estado,
                       emp.ds_nome_fantasia,
                       emp.id AS id_empresa,
                       'Previa'::text AS tp_vistoria,
                       pg.id_tipo_produto,
                       cu.id AS id_cultura,
                       cu.ds_nome_cultura,
                       c.id AS id_cobertura,
                       fu.ds_nome_funcionario AS perito,
                       to_char(pvp.dt_laudo, 'YYYY-MM-DD HH24:MI:SS'::text) AS dt_vistoria,
                       to_char(pvp.dt_laudo, 'DD/MM/YYYY'::text) AS dt_laudo,
                       pvp.dt_laudo AS dt_laudo_order,
                       sf.ds_chave AS ds_safra,
                       c.ds_chave_cobertura,
                       pd.id_seguradora,
                       pd.id_safra,
                       sf.ds_nome_safra,
                       emp.cpf_cnpj AS cpf_cnpj_empresa,
                       p.nr_apolice,
                       em.ds_nome_municipio AS ds_nome_municipio_empresa,
                       ee.ds_sigla AS ds_sigla_uf_empresa,
                       (COALESCE(fm.ds_nome_municipio::character varying, 'NAO INFORMADO'::character varying)::text || '/'::text) || COALESCE(fe.ds_sigla, '-'::bpchar)::text AS municipio_perito,
                       m.id AS id_municipio,
                       to_char(p.dt_criacao::timestamp with time zone, 'YYYY-MM-DD'::text) AS data_criacao_proposta
                  FROM seguro.propostas_endosso ped
                    JOIN seguro.propostas p ON ped.id_proposta = p.id
                    JOIN seguro.propostas_coberturas pc ON pc.id_proposta = p.id AND pc.fl_principal = true
                    JOIN produto.coberturas c ON c.id = pc.id_cobertura
                    JOIN produto.produtos pd ON pd.id = p.id_produto AND pd.id_safra >= ((SELECT safras.id - 1 FROM produto.safras WHERE safras.fl_vigente = true))
                    JOIN produto.safras sf ON sf.id = pd.id_safra
                    JOIN produto.produtos_geral pg ON pg.id = pd.id_produto_geral
                    JOIN produto.culturas cu ON cu.id = pg.id_cultura
                    LEFT JOIN sinistro.processos prc ON prc.id_proposta = p.id
                    JOIN seguro.propostas_propriedades pp ON p.id = pp.id_proposta
                    JOIN seguro.propostas_proponentes prop ON p.id = prop.id_proposta
                    JOIN sistema.municipios m ON pp.id_municipio = m.id
                    JOIN sistema.estados e ON m.id_estado = e.id
                    JOIN seguro.propostas_vistorias_previas pvp ON p.id = pvp.id_proposta AND pvp.fl_transmitido = true AND pvp.fl_nova_vistoria_custo_perito IS NOT TRUE
                    LEFT JOIN sistema.vistorias_agendamentos va ON va.id_vistoria = pvp.id_vistoria
                    LEFT JOIN sistema.agendamentos_funcionarios af ON af.id_agendamento = va.id_agendamento
                    LEFT JOIN sistema.funcionarios fu ON fu.id = af.id_funcionario
                    JOIN sistema.vistorias_empresas vemp ON pvp.id_vistoria = vemp.id_vistoria AND vemp.fl_ativo = true
                    JOIN sistema.empresas emp ON vemp.id_empresa = emp.id
                    LEFT JOIN seguro.v_id_proposta_mae ON v_id_proposta_mae.id_proposta = p.id_proposta_mae
                    LEFT JOIN sistema.municipios em ON em.id = emp.id_municipio
                    LEFT JOIN sistema.estados ee ON ee.id = em.id_estado
                    LEFT JOIN sistema.municipios fm ON fm.id = fu.id_municipio
                    LEFT JOIN sistema.estados fe ON fe.id = fm.id_estado
                ORDER BY (to_char(pvp.dt_laudo, 'DD/MM/YYYY'::text));

SQL
        );
    }
}
