<?php
declare(strict_types=1);

use Phinx\Migration\AbstractMigration;

final class Task2310061048 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, nr_ordem, fl_tipo, dt_criacao, id_usuario_criacao, id)
            VALUES ('Editar', 'endosso', 'tipossolicitacao', 'form', 'id', 1298, 'edit.png', '0', 'L', '2023-12-11 14:10:32', 4474, nextval('sistema.acao_id_seq'::regclass));
        INSERT INTO sistema.acao (ds_label, ds_module, ds_controller, ds_action, ds_param, id_parent, ds_image, nr_ordem, fl_tipo, dt_criacao, id_usuario_criacao, id)
            VALUES ('Ativar/Desativar', 'endosso', 'tipossolicitacao', 'active', 'id', 1298, 'active.png', '1', 'L', '2023-12-11 14:10:32', 4474, nextval('sistema.acao_id_seq'::regclass));
        INSERT INTO sistema.acao (ds_label, ds_module, ds_controller, ds_action, ds_param, id_parent, ds_image, nr_ordem, fl_tipo, dt_criacao, id_usuario_criacao, id) 
            VALUES ('Deletar', 'endosso', 'tipossolicitacao', 'delete', 'id', 1298, 'delete.png', '2', 'L', '2023-12-11 14:10:32', 4474, nextval('sistema.acao_id_seq'::regclass));
SQL
);

        $acoes = $this->fetchAll('SELECT id, ds_action FROM sistema.acao WHERE ds_module = \'endosso\' AND ds_controller = \'tipossolicitacao\'');
        $sql = $separator = '';

        foreach ($acoes as $acao) {
            $id = $acao['id'];

            if ($acao['ds_action'] == 'index') {
                $sql .= <<<SQL
                    $separator (12, $id, 2048)
SQL;
            } else {
                $sql .= <<<SQL
                    $separator (12, $id, 2048), (20, $id, 2048)
SQL;
            }

            $separator = ',';
        }

        $sql = 'INSERT INTO sistema.roles_acao (id_role, id_acao, id_usuario_criacao) VALUES ' . $sql . ';';
        $sql .= <<<SQL
            ALTER TABLE seguro.endosso_tipo_solicitacao ADD COLUMN id_usuario_responsavel INTEGER;
            ALTER TABLE seguro.endosso_tipo_solicitacao 
                ADD CONSTRAINT fk_endosso_tipo_solicitacao_id_usuario 
                FOREIGN KEY (id_usuario_responsavel) REFERENCES sistema.usuarios(id);

            ALTER TABLE seguro.propostas_endosso_solicitacao ADD COLUMN id_usuario_responsavel INTEGER;
            ALTER TABLE seguro.propostas_endosso_solicitacao 
                ADD CONSTRAINT fk_propostas_endosso_solicitacao_id_usuario 
                FOREIGN KEY (id_usuario_responsavel) REFERENCES sistema.usuarios(id);
SQL;

        $this->execute($sql);
    }

    public function down(): void
    {
        $this->execute(<<<SQL
            ALTER TABLE seguro.endosso_tipo_solicitacao DROP COLUMN id_usuario_responsavel;
            ALTER TABLE seguro.propostas_endosso_solicitacao DROP COLUMN id_usuario_responsavel;
            DELETE FROM sistema.roles_acao WHERE id_acao IN (
                SELECT id 
                FROM sistema.acao 
                WHERE 
                    ds_module = 'endosso' 
                    AND ds_controller = 'tipossolicitacao'
                    AND ds_action <> 'index');
            DELETE FROM sistema.roles_acao WHERE id_acao IN (
                SELECT id 
                FROM sistema.acao 
                WHERE 
                    ds_module = 'endosso' 
                    AND ds_controller = 'tipossolicitacao'
                    AND ds_action = 'index') AND id_role = 12;
            DELETE FROM sistema.acao WHERE ds_module = 'endosso' AND ds_controller = 'tipossolicitacao' AND ds_action <> 'index'; 
SQL
);
    }
}
