<?php
declare(strict_types=1);

use Phinx\Migration\AbstractMigration;

final class Task2311281339 extends AbstractMigration
{
    public function up(): void
    {
        $this->execute(<<<SQL
            CREATE TABLE seguro.orientacao_restricao_tecnica (
                id SERIAL,
                ds_orientacao VARCHAR(60) NOT NULL,
                CONSTRAINT pk_orientacao_restricao_tecnica PRIMARY KEY(id)
            ) INHERITS (public.campos_default);

            INSERT INTO seguro.orientacao_restricao_tecnica (id, ds_orientacao, id_usuario_criacao) 
                VALUES 
                    (1, 'Aceitar direto', 2068),
                    (2, 'Negar direto', 2068),
                    (3, 'Analisar individualmente', 2068);
SQL
);

        $this->alteracoesProponente();
        $this->alteracoesBeneficiario();
    }

    public function down(): void
    {
        $this->execute(<<<SQL
            DROP TABLE seguro.proponentes_restricoes_tecnicas_propostas;
            ALTER TABLE seguro.proponentes_restricoes_tecnicas DROP COLUMN id_orientacao_restricao_tecnica;
            DROP TABLE seguro.historico_proponente_restricao_tecnica;
            
            DROP TABLE seguro.historico_beneficiario_restricao_tecnica;
            DROP TABLE seguro.beneficiario_restricao_tecnica_proposta;
            DROP TABLE seguro.restricao_tecnica_beneficiario_restricao_tecnica;
            DROP TABLE seguro.beneficiario_restricao_tecnica;

            DROP TABLE seguro.orientacao_restricao_tecnica;
            ALTER TABLE seguro.beneficiarios DROP COLUMN fl_restricao;
SQL
);
    }

    private function alteracoesBeneficiario(): void
    {
        $this->execute(<<<SQL
            CREATE TABLE seguro.beneficiario_restricao_tecnica (
                id SERIAL,
                id_beneficiario INTEGER NOT NULL,
                id_funcionario_agronomo INTEGER,
                id_funcionario_perito INTEGER,
                id_corretor INTEGER NOT NULL,
                ds_descricao TEXT NOT NULL,
                id_orientacao_restricao_tecnica INTEGER NOT NULL,
                CONSTRAINT pk_beneficiario_restricao_tecnica PRIMARY KEY (id),
                CONSTRAINT fk_id_beneficiario FOREIGN KEY (id_beneficiario) REFERENCES seguro.beneficiarios(id),
                CONSTRAINT fk_id_corretor FOREIGN KEY (id_corretor) REFERENCES sistema.corretores(id),
                CONSTRAINT fk_id_orientacao_restricao_tecnica FOREIGN KEY (id_orientacao_restricao_tecnica) REFERENCES seguro.orientacao_restricao_tecnica(id),
                CONSTRAINT fk_id_funcionario_agronomo FOREIGN KEY (id_funcionario_agronomo) REFERENCES sistema.funcionarios(id),
                CONSTRAINT fk_id_funcionario_perito FOREIGN KEY (id_funcionario_perito) REFERENCES sistema.funcionarios(id)
            ) INHERITS (public.campos_default);

            CREATE TABLE seguro.beneficiario_restricao_tecnica_proposta (
                id_beneficiario_restricao_tecnica INTEGER,
                id_proposta INTEGER,
                CONSTRAINT pk_beneficiario_restricao_tecnica_proposta PRIMARY KEY (id_beneficiario_restricao_tecnica, id_proposta),
                CONSTRAINT fk_id_proposta FOREIGN KEY (id_proposta) REFERENCES seguro.propostas(id),
                CONSTRAINT fk_id_beneficiario_restricao_tecnica FOREIGN KEY (id_beneficiario_restricao_tecnica) REFERENCES seguro.beneficiario_restricao_tecnica(id)
            ) INHERITS (public.campos_default);

            CREATE TABLE seguro.historico_beneficiario_restricao_tecnica (
                id SERIAL,
                id_beneficiario_restricao_tecnica INTEGER NOT NULL,
                CONSTRAINT pk_historico_beneficiario_restricao_tecnica PRIMARY KEY(id),
                CONSTRAINT fk_id_beneficiario_restricao_tecnica FOREIGN KEY (id_beneficiario_restricao_tecnica) REFERENCES seguro.beneficiario_restricao_tecnica(id)
            ) INHERITS (public.campos_default);

            CREATE TABLE seguro.restricao_tecnica_beneficiario_restricao_tecnica (
                id_beneficiario_restricao_tecnica INTEGER,
                id_restricao_tecnica INTEGER,
                CONSTRAINT pk_restricao_tecnica_beneficiario_restricao_tecnica PRIMARY KEY (id_beneficiario_restricao_tecnica, id_restricao_tecnica),
                CONSTRAINT fk_id_beneficiario_restricao_tecnica FOREIGN KEY (id_beneficiario_restricao_tecnica) REFERENCES seguro.beneficiario_restricao_tecnica(id)
            ) INHERITS (public.campos_default);

            ALTER TABLE seguro.beneficiarios ADD COLUMN fl_restricao BOOLEAN DEFAULT FALSE;
SQL
);   
    }

    private function alteracoesProponente(): void
    {
        $rs = $this->fetchAll(<<<SQL
        SELECT id, id_proposta, id_usuario_criacao, dt_criacao FROM seguro.proponentes_restricoes_tecnicas
SQL
);

        $valuesVinculoProposta = $valuesHistorico = '';
        $separatorVinculoProposta = $separatorHistorico = '';
        foreach ($rs as $row) {
            if (!empty($row['id_proposta'])) {
                $valuesVinculoProposta .= "{$separatorVinculoProposta} ({$row['id']}, {$row['id_proposta']}, {$row['id_usuario_criacao']})";
                $separatorVinculoProposta = ',';
            }

            $valuesHistorico .= "{$separatorHistorico} ({$row['id']}, {$row['id_usuario_criacao']}, '{$row['dt_criacao']}')";
            $separatorHistorico = ',';
        }

        $this->execute(<<<SQL
            CREATE TABLE seguro.proponentes_restricoes_tecnicas_propostas (
                id_proponente_restricao_tecnica INTEGER,
                id_proposta INTEGER,
                CONSTRAINT pk_proponentes_restricoes_tecnicas_propostas PRIMARY KEY(id_proponente_restricao_tecnica, id_proposta),
                CONSTRAINT fk_id_proposta FOREIGN KEY(id_proposta) REFERENCES seguro.propostas(id),
                CONSTRAINT fk_id_proponente_restricao_tecnica FOREIGN KEY(id_proponente_restricao_tecnica) REFERENCES seguro.proponentes_restricoes_tecnicas(id)
            ) INHERITS (public.campos_default);

            CREATE TABLE seguro.historico_proponente_restricao_tecnica (
                id SERIAL,
                id_proponente_restricao_tecnica INTEGER NOT NULL,
                CONSTRAINT pk_historico_proponente_restricao_tecnica PRIMARY KEY(id),
                CONSTRAINT fk_id_proponente_restricao_tecnica FOREIGN KEY (id_proponente_restricao_tecnica) REFERENCES seguro.proponentes_restricoes_tecnicas(id)
            ) INHERITS (public.campos_default);

            INSERT INTO seguro.proponentes_restricoes_tecnicas_propostas (id_proponente_restricao_tecnica, id_proposta, id_usuario_criacao)
                VALUES {$valuesVinculoProposta};

            INSERT INTO seguro.historico_proponente_restricao_tecnica (id_proponente_restricao_tecnica, id_usuario_criacao, dt_criacao)
                VALUES {$valuesHistorico};
            
            ALTER TABLE seguro.proponentes_restricoes_tecnicas ADD COLUMN id_orientacao_restricao_tecnica INTEGER;
            UPDATE seguro.proponentes_restricoes_tecnicas SET id_orientacao_restricao_tecnica = 3;
            ALTER TABLE seguro.proponentes_restricoes_tecnicas ALTER COLUMN id_orientacao_restricao_tecnica SET NOT NULL;

            ALTER TABLE seguro.proponentes_restricoes_tecnicas 
                ADD CONSTRAINT fk_id_orientacao_restricao_tecnica 
                    FOREIGN KEY(id_orientacao_restricao_tecnica) REFERENCES seguro.orientacao_restricao_tecnica(id);
            ALTER TABLE seguro.proponentes_restricoes_tecnicas ALTER COLUMN id_proposta DROP NOT NULL;         
SQL
);
    }
}
