<?php
declare(strict_types=1);

use Phinx\Migration\AbstractMigration;

final class TaskSR45694 extends AbstractMigration
{
    public function up(): void
    {
        $this->table('sistema.tipo_status')
            ->insert([
                [
                    'ds_tipo_status' => 'Subvenção',
                    'ds_chave' => 'SUBVENCAO',
                ]
            ])->saveData();

        $idNovoTipoStatus = $this->getIdTipoStatusSubvencao();

        $this->table('sistema.status')
            ->insert([
                [
                    'ds_status' => 'Em Fila de Envio',
                    'cd_status' => 1,
                    'ds_chave' => 'EM_FILA_ENVIO',
                    'id_tipo_status' => $idNovoTipoStatus,
                ],
                [
                    'ds_status' => 'Reservada',
                    'cd_status' => 2,
                    'ds_chave' => 'RESERVADA',
                    'id_tipo_status' => $idNovoTipoStatus,
                ],
                [
                    'ds_status' => 'Concedida',
                    'cd_status' => 3,
                    'ds_chave' => 'CONCEDIDA',
                    'id_tipo_status' => $idNovoTipoStatus,
                ],
                [
                    'ds_status' => 'Não Concedida',
                    'cd_status' => 4,
                    'ds_chave' => 'NAO_CONCEDIDA',
                    'id_tipo_status' => $idNovoTipoStatus,
                ],
                [
                    'ds_status' => 'Sem Subvenção',
                    'cd_status' => 5,
                    'ds_chave' => 'SEM_SUBVENCAO',
                    'id_tipo_status' => $idNovoTipoStatus,
                ]
            ])->saveData();

        $rowIdStatusConcedida = $this->fetchRow("SELECT id FROM sistema.status WHERE id_tipo_status = {$idNovoTipoStatus} AND ds_chave = 'CONCEDIDA'");
        $rowIdStatusNaoConcedida = $this->fetchRow("SELECT id FROM sistema.status WHERE id_tipo_status = {$idNovoTipoStatus} AND ds_chave = 'NAO_CONCEDIDA'");
        $rowIdStatusSemSubvencao = $this->fetchRow("SELECT id FROM sistema.status WHERE id_tipo_status = {$idNovoTipoStatus} AND ds_chave = 'SEM_SUBVENCAO'");

        $this->execute(<<<SQL
CREATE TABLE seguro.propostas_subvencao (
    id SERIAL,
    id_proposta INTEGER NOT NULL,
    id_status_subvencao_estadual INTEGER NOT NULL,
    id_status_subvencao_federal INTEGER NOT NULL,
    CONSTRAINT pk_propostas_subvencao PRIMARY KEY (id),
    CONSTRAINT fk_propostas_subvencao_proposta FOREIGN KEY (id_proposta) REFERENCES seguro.propostas (id),
    CONSTRAINT fk_propostas_subvencao_status_subvencao_estadual FOREIGN KEY (id_status_subvencao_estadual) REFERENCES sistema.status (id),
    CONSTRAINT fk_propostas_subvencao_status_subvencao_federal FOREIGN KEY (id_status_subvencao_federal) REFERENCES sistema.status (id)
) INHERITS (public.campos_default);

INSERT INTO seguro.propostas_subvencao
     SELECT 2068 as id_usuario_criacao,
            null as id_usuario_alteracao,
            now() as dt_criacao,
            null as dt_alteracao,
            't' as fl_ativo,
            'f' as fl_del,
            nextval('seguro.propostas_subvencao_id_seq'::regclass),
            sp.id as id_proposta,
            CASE
              WHEN spq.id_proposta IS NOT NULL
                THEN
                  CASE
                    WHEN spq.ds_resposta = '1'
                      THEN {$rowIdStatusConcedida['id']}
                      ELSE {$rowIdStatusNaoConcedida['id']}
                   END
                ELSE {$rowIdStatusSemSubvencao['id']}
             END as id_status_subvencao_estadual,
             CASE
              WHEN spcc.id_proposta IS NOT NULL
                THEN
                  CASE
                    WHEN spcc.fl_ativo IS TRUE AND spcc.fl_retorno_pendente IS FALSE AND spcc.fl_sucesso IS TRUE
                      THEN {$rowIdStatusConcedida['id']}
                      ELSE {$rowIdStatusNaoConcedida['id']}
                   END
                ELSE {$rowIdStatusSemSubvencao['id']}
             END as id_status_subvencao_federal
       FROM seguro.propostas sp
            LEFT JOIN seguro.propostas_questionario spq ON spq.id_proposta = sp.id AND spq.id_atributo_rn = 154
            LEFT JOIN seguro.propostas_consulta_cadin spcc ON spcc.id_proposta = sp.id
      WHERE sp.id = sp.id_proposta_mae;
SQL
        );
    }

    public function down(): void
    {
        $this->table('seguro.propostas_subvencao')->drop()->save();

        $idNovoTipoStatus = $this->getIdTipoStatusSubvencao();

        $this->getQueryBuilder()
            ->delete('sistema.status')
            ->where(['id_tipo_status' => $idNovoTipoStatus])
            ->execute();

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

    private function getIdTipoStatusSubvencao()
    {
        $rowNovoTipoStatus = $this->fetchRow("SELECT id FROM sistema.tipo_status WHERE ds_chave = 'SUBVENCAO'");

        return $rowNovoTipoStatus['id'];
    }
}
