<?php
declare(strict_types=1);

use Phinx\Migration\AbstractMigration;

final class TaskSr57488 extends AbstractMigration
{
    public function up(): void
    {
        $this->execute("ALTER TABLE sistema.status ADD COLUMN fl_permite_hash_orcamento BOOLEAN NOT NULL DEFAULT FALSE");
        $this->execute("UPDATE sistema.status SET fl_permite_hash_orcamento = TRUE WHERE id IN (2, 3, 59)");

        $this->execute("CREATE TABLE seguro.propostas_hash_orcamento (
                             id_proposta     INTEGER         NOT NULL,
                             hash            VARCHAR(100)    NOT NULL,
                             CONSTRAINT pk_propostas_hash_orcamento PRIMARY KEY (id_proposta),
                             CONSTRAINT fk_propostas_hash_orcamento FOREIGN KEY (id_proposta) REFERENCES seguro.propostas (id)
                         )
                         INHERITS (public.campos_default)
                         WITH (OIDS=FALSE)
                         ;");

        $this->execute("CREATE OR REPLACE FUNCTION seguro.gera_hash_orcamento() RETURNS TRIGGER AS $$
                         DECLARE
                         
                         BEGIN
                             PERFORM 1
                                FROM seguro.propostas
                                JOIN sistema.status
                                  ON status.id = propostas.id_status
                               WHERE propostas.id = NEW.id_proposta
                                 AND status.fl_permite_hash_orcamento = TRUE
                                   ;
                             IF FOUND THEN
                                 IF    TG_OP = 'INSERT' THEN
                                     NEW.hash := MD5(NEW.dt_criacao::VARCHAR || NEW.dt_criacao::VARCHAR   || NEW.id_proposta::VARCHAR);
                                     RETURN NEW;
                                 ELSIF TG_OP = 'UPDATE' THEN
                                     NEW.hash := MD5(NEW.dt_criacao::VARCHAR || NEW.dt_alteracao::VARCHAR || NEW.id_proposta::VARCHAR);
                                     RETURN NEW;
                                 ELSE
                                     RETURN NULL;
                                 END IF;
                             ELSE
                                 RETURN NULL;
                             END IF;
                         END;
                         $$ LANGUAGE 'plpgsql';");
                      
        $this->execute("CREATE TRIGGER hash_orcamento BEFORE INSERT OR UPDATE OR DELETE ON seguro.propostas_hash_orcamento FOR EACH ROW EXECUTE FUNCTION seguro.gera_hash_orcamento();");
    }

    public function down(): void
    {
        $this->execute("DROP TABLE seguro.propostas_hash_orcamento");
        $this->execute("DROP FUNCTION seguro.gera_hash_orcamento()");
        $this->execute("ALTER TABLE sistema.status DROP COLUMN fl_permite_hash_orcamento");
    }
}
