<?php
declare(strict_types=1);

use Phinx\Migration\AbstractMigration;

final class Task2305042100 extends AbstractMigration
{
    var $pendencias = [
        'Confirmar/Corrigir áreas da quadra distribuída', 
        'Confirmar/Corrigir áreas da quadra unificada', 
        'Confirmar/Corrigir coordenadas geográficas',
        'Informar o nome da cultivar conforme indicada pelo MAPA',
        'Inserir croqui atualizado/Corrigir croqui',
        'Justificar quadra e/ou área negada',
        'Justificar/Corrigir observações do perito',
        'Justificar nova vistoria para quadra negada',
        'Seleção incorreta de quem acompanhou e assinou o laudo',
        'Zoneamento/Restrições da Seguradora',
        'Outras pendências de perito' 
    ];

    private function removeAcentos(string $string) : string {
        return strtr(utf8_decode($string), utf8_decode('àÀáÁâÂãÃäÄáèÈéÉêÊíÍìÌóÓòÒõÕôÔúÚùÙçÇ'), utf8_decode('aAaAaAaAaAaeEeEeEiIiIoOoOoOoOuUuUcC'));
    }

    public function createSchema(string $name): void {}

    public function dropSchema(string $name): void {}
    
    public function shouldExecute(): bool { return true; }

    public function up() {
        $row = [
            'ds_tipo_pendencia' => 'Pendência de Perito',
            'ds_chave' => 'PENDENCIA_PERITO'
        ];

        $this->table('atendimento.tipo_pendencia')->insert($row)->saveData();

        $tipoPendencia = $this->fetchRow('SELECT * FROM atendimento.tipo_pendencia WHERE ds_chave = \'PENDENCIA_PERITO\'');

        foreach ($this->pendencias as $pendencia) {
            $this->table('atendimento.pendencias')
                ->insert([
                    'id_tipo_pendencia' => $tipoPendencia['id'],
                    'ds_nome_pendencia' => $pendencia,
                    'ds_chave' => strtoupper(str_replace(' ','_',str_replace('/','_',$this->removeAcentos($pendencia)))),
                    'ds_descricao_pendencia' => $pendencia
                ])
                ->saveData();
        }

        $this->execute(<<<SQL
INSERT INTO sistema.acao (
    ds_label, 
    ds_module, 
    ds_controller, 
    ds_action, 
    id_parent, 
    ds_descricao, 
    fl_tipo, 
    id_usuario_criacao
) VALUES (
    'Combo Pendências', 
    'atendimento', 
    'pendencia', 
    'getpendencias', 
    359, 
    'Combo Pendências', 
    'A', 
    1008
)
SQL
        );

        $this->execute(<<<SQL
INSERT INTO sistema.roles_acao (
    id_usuario_criacao,
    id_role,
    id_acao,
    fl_permitido
) VALUES (
    1008,
    20,
    (SELECT id FROM sistema.acao WHERE ds_module = 'atendimento' AND ds_controller = 'pendencia' AND ds_action = 'getpendencias'),
    true
);
ALTER TABLE seguro.propostas_vistorias_previas_historico ADD column id_pendencia INTEGER;
ALTER TABLE seguro.propostas_vistorias_previas_historico 
ADD CONSTRAINT fk_propostas_vistorias_previas_historico_pendencia 
FOREIGN KEY (id_pendencia) REFERENCES atendimento.pendencias (id);
ALTER TABLE seguro.propostas_vistorias_previas ADD column id_pendencia INTEGER;
ALTER TABLE seguro.propostas_vistorias_previas 
ADD CONSTRAINT fk_propostas_vistorias_previas_pendencia 
FOREIGN KEY (id_pendencia) REFERENCES atendimento.pendencias (id);
SQL
        );
    }

    public function down() {
        foreach ($this->pendencias as $pendencia) {
            $this->getQueryBuilder()
                ->delete('atendimento.pendencias')
                ->where(['ds_nome_pendencia' => $pendencia])
                ->execute();
        }

        $this->getQueryBuilder()
            ->delete('atendimento.tipo_pendencia')
            ->where(['ds_chave' => 'PENDENCIA_PERITO'])
            ->execute();

        $this->execute(<<<SQL
DELETE FROM sistema.roles_acao WHERE id_role = 20 AND id_acao = (
    SELECT id FROM sistema.acao WHERE ds_module = 'atendimento' AND ds_controller = 'pendencia' AND ds_action = 'getpendencias');
DELETE FROM sistema.acao WHERE ds_module = 'atendimento' AND ds_controller = 'pendencia' AND ds_action = 'getpendencias';
ALTER TABLE seguro.propostas_vistorias_previas_historico DROP CONSTRAINT fk_propostas_vistorias_previas_historico_pendencia;
ALTER TABLE seguro.propostas_vistorias_previas_historico DROP COLUMN id_pendencia;
ALTER TABLE seguro.propostas_vistorias_previas DROP CONSTRAINT fk_propostas_vistorias_previas_pendencia;
ALTER TABLE seguro.propostas_vistorias_previas DROP COLUMN id_pendencia;
SQL
        );
    }
}