<?php
declare(strict_types=1);

use Phinx\Migration\AbstractMigration;

final class Task2302091351 extends AbstractMigration
{
    public function up(): void
    {
        $this->execute(<<<SQL
INSERT INTO sistema.acao (
    ds_label, 
    ds_module, 
    ds_controller, 
    ds_action, 
    ds_param, 
    id_parent, 
    ds_image, 
    ds_descricao, 
    fl_tipo, 
    dt_criacao, 
    id_usuario_criacao, 
    id
) VALUES (
    'Importar Laudo por XML', 
    'sinistro2', 
    'rotinas', 
    'importarlaudoxml', 
    '', 
    1649, 
    '', 
    '', 
    'A', 
    '2023-04-12 17:50:31', 
    1008, 
    nextval('sistema.acao_id_seq'::regclass)
);
ALTER TABLE sinistro.tipo_laudo_final ADD COLUMN fl_import_xml BOOLEAN default false;
ALTER TABLE sinistro.tipo_laudo_final ADD COLUMN ds_versao VARCHAR(50);
ALTER TABLE sinistro.tipo_laudo_preliminar ADD COLUMN ds_versao VARCHAR(50);
CREATE OR REPLACE VIEW sinistro.v_laudos_peritos AS
SELECT DISTINCT laudos_cobertura.id,
    laudos_cobertura.produto_cobertura,
    laudos_cobertura.id_safra,
    laudos_cobertura.fl_ativo,
    laudos_cobertura.tipo,
    laudos_cobertura.arquivo,
    laudos_cobertura.chave,
    laudos_cobertura.digitavel,
    laudos_cobertura.ds_versao
   FROM ( SELECT DISTINCT tlp.id,
            tlp.ds_nome_tipo_laudo_preliminar,
            tlp.ds_chave AS chave,
            tlp.ds_nome_arquivo AS arquivo,
                CASE
                    WHEN tlp.id_safra IS NULL THEN p.id_safra
                    ELSE tlp.id_safra
                END AS id_safra,
                CASE
                    WHEN dg.tablename IS NULL THEN 'Não'::text
                    ELSE 'Sim'::text
                END AS digitavel,
            array_to_string(ARRAY( SELECT ((pp.ds_nome_produto::text || ' ('::text) || c.ds_nome_cobertura::text) || ')'::text AS produto_cobertura
                   FROM produto.produtos pp
                     JOIN produto.produtos_coberturas ppc ON pp.id = ppc.id_produto
                     JOIN produto.coberturas c ON c.id = ppc.id_cobertura
                  WHERE ppc.id_tipo_laudo_preliminar = tlp.id AND pp.id_safra = p.id_safra
                  ORDER BY pp.ds_nome_produto), ', '::text) AS produto_cobertura,
            tlp.fl_ativo,
            tlp.ds_versao,
            'Laudo Preliminar'::text AS tipo
           FROM sinistro.tipo_laudo_preliminar tlp
             JOIN produto.produtos_coberturas pc ON pc.id_tipo_laudo_preliminar = tlp.id
             JOIN produto.produtos p ON p.id = pc.id_produto
             LEFT JOIN ( SELECT pg_tables.tablename
                   FROM pg_tables
                  WHERE pg_tables.schemaname = 'regulacao'::name) dg ON lower(dg.tablename::text) = lower(tlp.ds_chave::text)
        UNION
         SELECT DISTINCT tlf.id,
            tlf.ds_nome_tipo_laudo_final,
            tlf.ds_chave AS chave,
            tlf.ds_nome_arquivo AS arquivo,
                CASE
                    WHEN tlf.id_safra IS NULL THEN p.id_safra
                    ELSE tlf.id_safra
                END AS id_safra,
                CASE
                    WHEN dg.tablename IS NULL THEN 'Não'::text
                    ELSE 'Sim'::text
                END AS digitavel,
            array_to_string(ARRAY( SELECT ((pp.ds_nome_produto::text || ' ('::text) || c.ds_nome_cobertura::text) || ')'::text AS produto_cobertura
                   FROM produto.produtos pp
                     JOIN produto.produtos_coberturas ppc ON pp.id = ppc.id_produto
                     JOIN produto.coberturas c ON c.id = ppc.id_cobertura
                  WHERE ppc.id_tipo_laudo_final = tlf.id AND pp.id_safra = p.id_safra
                  ORDER BY pp.ds_nome_produto), ', '::text) AS produto_cobertura,
            tlf.fl_ativo,
            tlf.ds_versao,
            'Laudo Final'::text AS tipo
           FROM sinistro.tipo_laudo_final tlf
             JOIN produto.produtos_coberturas pc ON pc.id_tipo_laudo_final = tlf.id
             JOIN produto.produtos p ON p.id = pc.id_produto
             LEFT JOIN ( SELECT pg_tables.tablename
                   FROM pg_tables
                  WHERE pg_tables.schemaname = 'regulacao'::name) dg ON lower(dg.tablename::text) = lower(tlf.ds_chave::text)) laudos_cobertura
  ORDER BY laudos_cobertura.chave;
INSERT INTO sistema.tipo_status (
    ds_tipo_status,
    ds_chave
) values (
    'Laudo Importado XML',
    'LAUDO_XML'
);
SQL
        );

        $row = $this->fetchRow("SELECT id FROM sistema.tipo_status WHERE ds_chave = 'LAUDO_XML'");
        if ($row) {
            $i=0;
            $status = [
                'Enviado' => 'ENVIADO',
                'Enviado - Não Assinadao' => 'ENVIADO_NAO_ASSINADO',
                'Dispensado' => 'DISPENSADO',
                'Inconsistência' => 'INCONSISTENCIA',
                'Pendente' => 'PENDENTE'
            ];

            $table = $this->table('sistema.status');
            foreach($status as $k => $v) {
                $insert = [
                    'id_usuario_criacao' => 2068,
                    'dt_criacao' => 'NOW()',
                    'ds_status' => $k,
                    'cd_status' => ++$i,
                    'ds_chave' => $v,
                    'id_tipo_status' => $row['id']
                ];
                $table->insert($insert);
            }

            $table->saveData();
        }

        $this->execute(<<<SQL
CREATE TABLE sinistro.laudo_xml_importacao (
    id SERIAL,
    id_vistoria INTEGER NOT NULL,
    id_proposta INTEGER NOT NULL,
    id_laudo_final INTEGER NOT NULL,
    ds_nome_arquivo_xml VARCHAR(100) NOT NULL,
    CONSTRAINT pk_laudo_xml_importacao PRIMARY KEY (id),
    CONSTRAINT fk_laudo_xml_importacao_vistoria FOREIGN KEY (id_vistoria) 
        REFERENCES sistema.vistorias (id),
    CONSTRAINT fk_laudo_xml_importacao_proposta FOREIGN KEY (id_proposta)
        REFERENCES seguro.propostas (id),
    CONSTRAINT fk_laudo_xml_importacao_laudo_final FOREIGN KEY (id_laudo_final)
        REFERENCES sinistro.laudos_finais
) INHERITS (campos_default);

CREATE TABLE sinistro.laudo_xml_importacao_aviso (
    id SERIAL,
    id_laudo_xml_importacao INTEGER NOT NULL,
    id_aviso INTEGER NOT NULL,
    CONSTRAINT pk_laudo_xml_importacao_aviso PRIMARY KEY (id),
    CONSTRAINT fk_laudo_xml_importacao_aviso FOREIGN KEY (id_laudo_xml_importacao)
        REFERENCES sinistro.laudo_xml_importacao (id),
    CONSTRAINT fk_laudo_xml_importacao_aviso_aviso FOREIGN KEY (id_aviso)
        REFERENCES sinistro.avisos (id)
) INHERITS (campos_default);

CREATE TABLE sinistro.laudo_xml_importacao_item (
    id SERIAL,
    id_laudo_xml_importacao INTEGER NOT NULL,
    id_item_segurado INTEGER NOT NULL,
    id_status INTEGER NOT NULL,
    id_motivo_nao_vistoriado INTEGER,
    ds_nome_laudo VARCHAR(100) NOT NULL,
    CONSTRAINT pk_laudo_xml_importacao_item PRIMARY KEY (id),
    CONSTRAINT fk_laudo_xml_importacao_item FOREIGN KEY (id_laudo_xml_importacao)
        REFERENCES sinistro.laudo_xml_importacao (id),
    CONSTRAINT fk_laudo_xml_importacao_item_item FOREIGN KEY (id_item_segurado)
        REFERENCES seguro.itens_segurados (id),
    CONSTRAINT fk_laudo_xml_importacao_item_motivo FOREIGN KEY (id_motivo_nao_vistoriado)
        REFERENCES sinistro.motivos_quadra_nao_vistoriada (id)
) INHERITS (campos_default);

CREATE TABLE sinistro.laudo_xml_importacao_item_historico (
    id SERIAL,
    id_laudo_xml_importacao INTEGER NOT NULL,
    ds_mensagem VARCHAR(100),
    fl_sucesso BOOLEAN NOT NULL DEFAULT false,
    id_item_segurado INTEGER NOT NULL,
    CONSTRAINT pk_laudo_xml_importacao_item_historico PRIMARY KEY (id),
    CONSTRAINT fk_laudo_xml_importacao_item_historico FOREIGN KEY (id_laudo_xml_importacao)
        REFERENCES sinistro.laudo_xml_importacao (id),
    CONSTRAINT fk_laudo_xml_importacao_item_historico_item FOREIGN KEY (id_item_segurado)
        REFERENCES seguro.itens_segurados (id)
) INHERITS (campos_default);
SQL
        );
    }

    public function down(): void
    {
        $this->execute(<<<SQL
DELETE FROM sistema.acao WHERE ds_label = 'Importar Laudo por XML' AND ds_module = 'sinistro2' AND ds_controller = 'rotinas' AND ds_action = 'importarlaudoxml';
ALTER TABLE sinistro.tipo_laudo_final DROP COLUMN ds_versao CASCADE;
ALTER TABLE sinistro.tipo_laudo_final DROP COLUMN fl_import_xml BOOLEAN default false;
ALTER TABLE sinistro.tipo_laudo_preliminar DROP COLUMN ds_versao;
CREATE OR REPLACE VIEW sinistro.v_laudos_peritos AS
SELECT DISTINCT laudos_cobertura.id,
    laudos_cobertura.produto_cobertura,
    laudos_cobertura.id_safra,
    laudos_cobertura.fl_ativo,
    laudos_cobertura.tipo,
    laudos_cobertura.arquivo,
    laudos_cobertura.chave,
    laudos_cobertura.digitavel
   FROM ( SELECT DISTINCT tlp.id,
            tlp.ds_nome_tipo_laudo_preliminar,
            tlp.ds_chave AS chave,
            tlp.ds_nome_arquivo AS arquivo,
                CASE
                    WHEN tlp.id_safra IS NULL THEN p.id_safra
                    ELSE tlp.id_safra
                END AS id_safra,
                CASE
                    WHEN dg.tablename IS NULL THEN 'Não'::text
                    ELSE 'Sim'::text
                END AS digitavel,
            array_to_string(ARRAY( SELECT ((pp.ds_nome_produto::text || ' ('::text) || c.ds_nome_cobertura::text) || ')'::text AS produto_cobertura
                   FROM produto.produtos pp
                     JOIN produto.produtos_coberturas ppc ON pp.id = ppc.id_produto
                     JOIN produto.coberturas c ON c.id = ppc.id_cobertura
                  WHERE ppc.id_tipo_laudo_preliminar = tlp.id AND pp.id_safra = p.id_safra
                  ORDER BY pp.ds_nome_produto), ', '::text) AS produto_cobertura,
            tlp.fl_ativo,
            'Laudo Preliminar'::text AS tipo
           FROM sinistro.tipo_laudo_preliminar tlp
             JOIN produto.produtos_coberturas pc ON pc.id_tipo_laudo_preliminar = tlp.id
             JOIN produto.produtos p ON p.id = pc.id_produto
             LEFT JOIN ( SELECT pg_tables.tablename
                   FROM pg_tables
                  WHERE pg_tables.schemaname = 'regulacao'::name) dg ON lower(dg.tablename::text) = lower(tlp.ds_chave::text)
        UNION
         SELECT DISTINCT tlf.id,
            tlf.ds_nome_tipo_laudo_final,
            tlf.ds_chave AS chave,
            tlf.ds_nome_arquivo AS arquivo,
                CASE
                    WHEN tlf.id_safra IS NULL THEN p.id_safra
                    ELSE tlf.id_safra
                END AS id_safra,
                CASE
                    WHEN dg.tablename IS NULL THEN 'Não'::text
                    ELSE 'Sim'::text
                END AS digitavel,
            array_to_string(ARRAY( SELECT ((pp.ds_nome_produto::text || ' ('::text) || c.ds_nome_cobertura::text) || ')'::text AS produto_cobertura
                   FROM produto.produtos pp
                     JOIN produto.produtos_coberturas ppc ON pp.id = ppc.id_produto
                     JOIN produto.coberturas c ON c.id = ppc.id_cobertura
                  WHERE ppc.id_tipo_laudo_final = tlf.id AND pp.id_safra = p.id_safra
                  ORDER BY pp.ds_nome_produto), ', '::text) AS produto_cobertura,
            tlf.fl_ativo,
            'Laudo Final'::text AS tipo
           FROM sinistro.tipo_laudo_final tlf
             JOIN produto.produtos_coberturas pc ON pc.id_tipo_laudo_final = tlf.id
             JOIN produto.produtos p ON p.id = pc.id_produto
             LEFT JOIN ( SELECT pg_tables.tablename
                   FROM pg_tables
                  WHERE pg_tables.schemaname = 'regulacao'::name) dg ON lower(dg.tablename::text) = lower(tlf.ds_chave::text)) laudos_cobertura
  ORDER BY laudos_cobertura.chave;
SQL
        );

        $row = $this->fetchRow("SELECT id FROM sistema.tipo_status WHERE ds_chave = 'LAUDO_XML'");

        if ($row) {
            $this->getQueryBuilder()
                ->delete('sistema.status')
                ->where(['id_tipo_status' => $row['id']])
                ->execute();

            $this->getQueryBuilder()
                ->delete('sistema.tipo_status')
                ->where(['ds_chave' => 'LAUDO_XML'])
                ->execute();
        }

        $this->execute(<<<SQL
DROP TABLE sinistro.laudo_xml_importacao_aviso;
DROP TABLE sinistro.laudo_xml_importacao_historico;
DROP TABLE sinistro.laudo_xml_importacao_item;
DROP TABLE sinistro.laudo_xml_importacao;
SQL
        );
    }
}
