<?php
declare(strict_types=1);

use Phinx\Migration\AbstractMigration;

final class Task2310111037 extends AbstractMigration
{
    public function up(): void
    {
        $this->execute(<<<SQL
            CREATE TABLE sinistro.tipos_arquivos_laudos_finais (
                id SERIAL,
                ds_tipo_arquivo VARCHAR(100) NOT NULL,
                ds_chave_tipo_arquivo VARCHAR(100) NOT NULL,
                CONSTRAINT pk_tipos_arquivos_laudos_finais PRIMARY KEY (id)
            ) INHERITS (public.campos_default);

            INSERT INTO sinistro.tipos_arquivos_laudos_finais (id_usuario_criacao, dt_criacao, id, ds_tipo_arquivo, ds_chave_tipo_arquivo) 
                VALUES (2068, now(), 1, 'Foto do acompanhante', 'FOTO_ACOMPANHANTE_DOC'),
                       (2068, now(), 2, 'Foto do frente do documento do acompanhante', 'FOTO_DOC_FRENTE'),
                       (2068, now(), 3, 'Foto do verso do documento do acompanhante', 'FOTO_DOC_VERSO'),
                       (2068, now(), 4, 'Foto da autorização do acompanhante', 'FOTO_AUTORIZACAO'),
                       (2068, now(), 5, 'Foto do local ou GPS', 'FOTO_LOCAL_OU_GPS'),
                       (2068, now(), 6, 'Vídeo do acompanhante', 'VIDEO_ACOMPANHANTE'),
                       (2068, now(), 7, 'Foto do local de ínicio da vistoria do item', 'FOTO_LOCAL_INICIO'),
                       (2068, now(), 8, 'Foto do local do zoneamento do item', 'FOTO_LOCAL_ZONEAMENTO'),
                       (2068, now(), 9, 'Foto do local da dispensa da vistoria', 'FOTO_LOCAL_DISPENSA_VISTORIA'),
                       (2068, now(), 10, 'Foto do local da negação do item', 'FOTO_LOCAL_NEGACAO_ITEM'),
                       (2068, now(), 11, 'Foto da tela do GPS do início da vistoria do item', 'FOTO_TELA_GPS'),
                       (2068, now(), 12, 'Foto da vistoria do item', 'FOTO_VISTORIA_ITEM'),
                       (2068, now(), 13, 'Foto do GPS do início da amostra mecanizada', 'FOTO_GPS_MECANIZADA_INICIO'),
                       (2068, now(), 14, 'Foto do GPS do término da amostra mecanizada', 'FOTO_GPS_MECANIZADA_TERMINO'),
                       (2068, now(), 15, 'Foto do GPS do início da amostra manual', 'FOTO_INICIO_MANUAL'),
                       (2068, now(), 16, 'Foto do GPS do término da amostra manual', 'FOTO_GPS_MANUAL'),
                       (2068, now(), 17, 'Foto da amostra manuai coletada', 'FOTO_AMOSTRA_MANUAL'),
                       (2068, now(), 18, 'Foto da pesagem da amostra manual', 'FOTO_PESAGEM_AMOSTRA_MANUAL');
            
            SELECT setval('sinistro.tipos_arquivos_laudos_finais_id_seq', 18, true);

            ALTER TABLE sinistro.laudos_finais_itens_segurados ADD COLUMN dt_fim_vistoria TIMESTAMP WITHOUT TIME ZONE;
            ALTER TABLE sinistro.laudos_finais_itens_segurados ADD COLUMN vl_area_medicao NUMERIC(6,2);
            ALTER TABLE sinistro.laudos_finais_itens_segurados ADD COLUMN vl_area_vistoriada NUMERIC(6,2);
            ALTER TABLE sinistro.laudos_finais_itens_segurados ADD COLUMN vl_area_colhidos_antes_vistoria NUMERIC(6,2);
            ALTER TABLE sinistro.laudos_finais_itens_segurados ADD COLUMN vl_area_resta_avaliar NUMERIC(6,2);
            ALTER TABLE sinistro.laudos_finais_itens_segurados ADD COLUMN dt_nova_vistoria DATE;
            ALTER TABLE sinistro.laudos_finais_itens_segurados ADD COLUMN vl_altitude NUMERIC(6,2);
            ALTER TABLE sinistro.laudos_finais_itens_segurados ADD COLUMN vl_area_declarada NUMERIC(6,2);
            ALTER TABLE sinistro.laudos_finais_itens_segurados ADD COLUMN id_variedade INT;
            ALTER TABLE sinistro.laudos_finais_itens_segurados ADD CONSTRAINT fk_laudos_finais_itens_segurados_variedades FOREIGN KEY (id_variedade) REFERENCES produto.variedades (id);
            ALTER TABLE sinistro.laudos_finais_itens_segurados ADD COLUMN id_tipo_solo INT;
            ALTER TABLE sinistro.laudos_finais_itens_segurados ADD CONSTRAINT fk_laudos_finais_itens_segurados_tipo_solo FOREIGN KEY (id_tipo_solo) REFERENCES produto.tipo_solo (id);
            ALTER TABLE sinistro.laudos_finais_itens_segurados ADD COLUMN id_sistema_plantio INT;
            ALTER TABLE sinistro.laudos_finais_itens_segurados ADD COLUMN dt_inicio_plantio DATE;
            ALTER TABLE sinistro.laudos_finais_itens_segurados ADD COLUMN dt_termino_plantio DATE;
            ALTER TABLE sinistro.laudos_finais_itens_segurados ADD COLUMN fl_zoneamento_valido BOOLEAN;
            ALTER TABLE sinistro.laudos_finais_itens_segurados ADD COLUMN id_tipo_laudo_final INT;
            ALTER TABLE sinistro.laudos_finais_itens_segurados ADD CONSTRAINT fk_laudos_finais_itens_segurados_tipo_laudo_final FOREIGN KEY (id_tipo_laudo_final) REFERENCES sinistro.tipo_laudo_final (id);
            ALTER TABLE sinistro.laudos_finais_itens_segurados ADD COLUMN ds_tipo_amostragem VARCHAR(10);
            ALTER TABLE sinistro.laudos_finais_itens_segurados ADD COLUMN fl_vistoria_parcial BOOLEAN;
            
            ALTER TABLE regulacao.lf003_itens_segurados_amostras ADD COLUMN ds_coordenadas TEXT;
            ALTER TABLE regulacao.lf034_itens_segurados_amostras ADD COLUMN ds_coordenadas TEXT;

            ALTER TABLE sinistro.laudos_finais_itens_segurados_arquivos ADD COLUMN ds_coordenada VARCHAR(100);
            ALTER TABLE sinistro.laudos_finais_itens_segurados_arquivos ADD COLUMN md5 VARCHAR(255);
            ALTER TABLE sinistro.laudos_finais_itens_segurados_arquivos ADD COLUMN id_tipo_arquivo_laudo_final INTEGER;
            ALTER TABLE sinistro.laudos_finais_itens_segurados_arquivos ADD CONSTRAINT fk_laudos_finais_itens_segurados_arquivos_tipos_arquivos_laudos_finais FOREIGN KEY (id_tipo_arquivo_laudo_final) REFERENCES sinistro.tipos_arquivos_laudos_finais (id);

            ALTER TABLE sinistro.laudos_finais ADD COLUMN fl_acompanhante_possui_autorizacao boolean default false;
            ALTER TABLE sinistro.laudos_finais ADD COLUMN ds_tipo_envio_doc_acompanhante VARCHAR(10);
            ALTER TABLE sinistro.laudos_finais ADD COLUMN ds_tipo_envio_laudo VARCHAR(10);
            ALTER TABLE sinistro.laudos_finais ADD COLUMN ds_email_segurado email;
            ALTER TABLE sinistro.laudos_finais ADD COLUMN ds_telefone_segurado telefone;
            ALTER TABLE sinistro.laudos_finais ADD COLUMN version_db VARCHAR(100);
            ALTER TABLE sinistro.laudos_finais ADD COLUMN version_name VARCHAR(20);
            ALTER TABLE sinistro.laudos_finais DROP COLUMN ds_motivo;

            ALTER TABLE sinistro.laudos_finais_arquivos ADD COLUMN ds_coordenada VARCHAR(100);
            ALTER TABLE sinistro.laudos_finais_arquivos ADD COLUMN md5 VARCHAR(255);
            ALTER TABLE sinistro.laudos_finais_arquivos ADD COLUMN id_tipo_arquivo_laudo_final INTEGER;
            ALTER TABLE sinistro.laudos_finais_arquivos ADD CONSTRAINT fk_laudos_finais_arquivos_tipos_arquivos_laudos_finais FOREIGN KEY (id_tipo_arquivo_laudo_final) REFERENCES sinistro.tipos_arquivos_laudos_finais (id);

            ALTER TABLE regulacao.lf003_itens_segurados_amostras ADD COLUMN vl_m2_perda_colheita NUMERIC(6,2);
            ALTER TABLE regulacao.lf003_itens_segurados_amostras ADD COLUMN vl_producao_perdida_colheita NUMERIC(6,4);

            ALTER TABLE regulacao.lf034_itens_segurados_amostras ADD COLUMN vl_m2_perda_colheita NUMERIC(6,2);
            ALTER TABLE regulacao.lf034_itens_segurados_amostras ADD COLUMN vl_producao_perdida_colheita NUMERIC(6,4);

            ALTER TABLE regulacao.lf003_itens_segurados ADD COLUMN vl_percentual_graos_avariados NUMERIC(6,2);
            ALTER TABLE regulacao.lf034_itens_segurados ADD COLUMN vl_percentual_graos_avariados NUMERIC(6,2);

            CREATE TABLE log.log_alteracoes_vistorias_finais (
                id SERIAL,
                id_vistoria int NOT NULL,
                id_proposta int NOT NULL,
                id_laudo_final int NOT NULL,
                id_item_segurado int NOT NULL,
                ds_alteracoes jsonb NOT NULL,
                CONSTRAINT pk_log_alteracoes_vistorias_finais PRIMARY KEY (id),
                CONSTRAINT fk_log_alteracoes_vistorias_finais_vistoria FOREIGN KEY (id_vistoria) REFERENCES sistema.vistorias (id),
                CONSTRAINT fk_log_alteracoes_vistorias_finais_proposta FOREIGN KEY (id_proposta) REFERENCES seguro.propostas (id),
                CONSTRAINT fk_log_alteracoes_vistorias_finais_laudo_final FOREIGN KEY (id_laudo_final) REFERENCES sinistro.laudos_finais (id),
                CONSTRAINT fk_log_alteracoes_vistorias_finais_item_segurado FOREIGN KEY (id_item_segurado) REFERENCES seguro.itens_segurados (id)
            ) INHERITS (public.campos_default);
SQL
        );
    }

    public function down(): void
    {
        $this->execute(<<<SQL

            DROP TABLE log.log_alteracoes_vistorias_finais;

            ALTER TABLE regulacao.lf003_itens_segurados DROP COLUMN vl_percentual_graos_avariados;
            ALTER TABLE regulacao.lf034_itens_segurados DROP COLUMN vl_percentual_graos_avariados;

            ALTER TABLE regulacao.lf003_itens_segurados_amostras DROP COLUMN vl_m2_perda_colheita;
            ALTER TABLE regulacao.lf003_itens_segurados_amostras DROP COLUMN vl_producao_perdida_colheita;

            ALTER TABLE regulacao.lf034_itens_segurados_amostras DROP COLUMN vl_m2_perda_colheita;
            ALTER TABLE regulacao.lf034_itens_segurados_amostras DROP COLUMN vl_producao_perdida_colheita;

            ALTER TABLE sinistro.laudos_finais_arquivos DROP COLUMN id_tipo_arquivo_laudo_final;
            ALTER TABLE sinistro.laudos_finais_arquivos DROP COLUMN md5;
            ALTER TABLE sinistro.laudos_finais_arquivos DROP COLUMN ds_coordenada;

            ALTER TABLE sinistro.laudos_finais ADD COLUMN ds_motivo text;
            ALTER TABLE sinistro.laudos_finais DROP COLUMN version_name;
            ALTER TABLE sinistro.laudos_finais DROP COLUMN version_db;
            ALTER TABLE sinistro.laudos_finais DROP COLUMN fl_acompanhante_possui_autorizacao;
            ALTER TABLE sinistro.laudos_finais DROP COLUMN ds_tipo_envio_doc_acompanhante;
            ALTER TABLE sinistro.laudos_finais DROP COLUMN ds_tipo_envio_laudo;
            ALTER TABLE sinistro.laudos_finais DROP COLUMN ds_email_segurado;
            ALTER TABLE sinistro.laudos_finais DROP COLUMN ds_telefone_segurado;

            ALTER TABLE sinistro.laudos_finais_itens_segurados_arquivos DROP COLUMN ds_coordenada;
            ALTER TABLE sinistro.laudos_finais_itens_segurados_arquivos DROP COLUMN md5;
            ALTER TABLE sinistro.laudos_finais_itens_segurados_arquivos DROP COLUMN id_tipo_arquivo_laudo_final;

            ALTER TABLE regulacao.lf003_itens_segurados_amostras DROP COLUMN ds_coordenadas;
            ALTER TABLE regulacao.lf034_itens_segurados_amostras DROP COLUMN ds_coordenadas;

            ALTER TABLE sinistro.laudos_finais_itens_segurados DROP COLUMN dt_fim_vistoria;
            ALTER TABLE sinistro.laudos_finais_itens_segurados DROP COLUMN vl_area_medicao;
            ALTER TABLE sinistro.laudos_finais_itens_segurados DROP COLUMN vl_area_vistoriada;
            ALTER TABLE sinistro.laudos_finais_itens_segurados DROP COLUMN vl_area_colhidos_antes_vistoria;
            ALTER TABLE sinistro.laudos_finais_itens_segurados DROP COLUMN vl_area_resta_avaliar;
            ALTER TABLE sinistro.laudos_finais_itens_segurados DROP COLUMN dt_nova_vistoria;
            ALTER TABLE sinistro.laudos_finais_itens_segurados DROP COLUMN vl_altitude;
            ALTER TABLE sinistro.laudos_finais_itens_segurados DROP COLUMN vl_area_declarada;
            ALTER TABLE sinistro.laudos_finais_itens_segurados DROP COLUMN id_variedade;
            ALTER TABLE sinistro.laudos_finais_itens_segurados DROP COLUMN id_tipo_solo;
            ALTER TABLE sinistro.laudos_finais_itens_segurados DROP COLUMN id_sistema_plantio;
            ALTER TABLE sinistro.laudos_finais_itens_segurados DROP COLUMN dt_inicio_plantio;
            ALTER TABLE sinistro.laudos_finais_itens_segurados DROP COLUMN dt_termino_plantio;
            ALTER TABLE sinistro.laudos_finais_itens_segurados DROP COLUMN fl_zoneamento_valido;
            ALTER TABLE sinistro.laudos_finais_itens_segurados DROP COLUMN id_tipo_laudo_final;
            ALTER TABLE sinistro.laudos_finais_itens_segurados DROP COLUMN ds_tipo_amostragem;
            ALTER TABLE sinistro.laudos_finais_itens_segurados DROP COLUMN fl_vistoria_parcial;

            DROP TABLE sinistro.tipos_arquivos_laudos_finais;
SQL
        );
    }
}
