<?php
declare(strict_types=1);

use Phinx\Migration\AbstractMigration;

final class Task2101251132 extends AbstractMigration
{
    public function up(): void
    {
        $this->upAcao();
        $this->upLf042();
        $this->upLf042ItensSegurados();
        $this->upLf042ItensSeguradosAmostras();
        $this->upGrupoEstadiosFenologicos();
        $this->upEstadiosFenologicos();
        $this->upLiberarAcoesPerfil();
    }

    public function down(): void
    {
        $this->downLiberarAcoesPerfil();
        $this->downAcao();
        $this->downLf042ItensSeguradosAmostras();
        $this->downLf042ItensSegurados();
        $this->downLf042();
        $this->downEstadiosFenologicos();
        $this->downGrupoEstadiosFenologicos();
    }

    private function upAcao()
    {
        $this->execute(<<<SQL
INSERT INTO sistema.acao (ds_label, ds_module, ds_controller, ds_action, ds_param, id_parent, ds_image, ds_descricao, fl_tipo, dt_criacao, id_usuario_criacao, id) VALUES ('Laudo Final LF042', 'regulacao', 'lf042', 'form', '', 1752, '', 'Laudo Final LF042', 'A', '2021-02-18 12:44:18', 3379, nextval('sistema.acao_id_seq'::regclass));
SQL
        );

        $queryParent = $this->query("SELECT id FROM sistema.acao WHERE ds_label = 'Laudo Final LF042' AND ds_module = 'regulacao' AND ds_controller = 'lf042'");
        $rows = $queryParent->fetchAll();
        $idParent = $rows[0]['id'];

        $this->execute(<<<SQL
INSERT INTO sistema.acao (ds_label, ds_module, ds_controller, ds_action, ds_param, id_parent, ds_image, ds_descricao, fl_tipo, dt_criacao, id_usuario_criacao, id) VALUES ('Item Segurado', 'regulacao', 'lf042itemsegurado', 'form', '', $idParent, '', 'Item Segurado', 'A', '2021-03-11 14:47:40', 3379, nextval('sistema.acao_id_seq'::regclass));
SQL
        );
    }

    private function upGrupoEstadiosFenologicos()
    {
        $this->execute(<<<SQL
INSERT INTO produto.grupos_estadios_fenologicos (ds_nome_grupo, ds_chave_grupo) VALUES ('Milho Silagem', 'MILHO_SILAGEM');
SQL
);
    }

    private function upEstadiosFenologicos()
    {
        $queryParent = $this->query("SELECT id FROM produto.grupos_estadios_fenologicos WHERE ds_nome_grupo = 'Milho Silagem' AND ds_chave_grupo = 'MILHO_SILAGEM'");
        $rows = $queryParent->fetchAll();
        $idParent = $rows[0]['id'];

        $this->execute(<<<SQL
INSERT INTO produto.estadios_fenologicos (id_grupo_estadio_fenologico, cd_estadio_fenologico, ds_nome_estadio_fenologico, ds_chave)
                                  VALUES ($idParent, 'A', 'Grão Dentado (1/2 linha do leite)', 'GRAO_DENTADO');
INSERT INTO produto.estadios_fenologicos (id_grupo_estadio_fenologico, cd_estadio_fenologico, ds_nome_estadio_fenologico, ds_chave)
                                  VALUES ($idParent, 'B', 'Grão Dentado Tardio (3/4 linha do leite)', 'GRAO_DENTADO_TARDIO');
INSERT INTO produto.estadios_fenologicos (id_grupo_estadio_fenologico, cd_estadio_fenologico, ds_nome_estadio_fenologico, ds_chave)
                                  VALUES ($idParent, 'C', 'Início da Maturação', 'INICIO_MATURACAO');
INSERT INTO produto.estadios_fenologicos (id_grupo_estadio_fenologico, cd_estadio_fenologico, ds_nome_estadio_fenologico, ds_chave)
                                  VALUES ($idParent, 'D', 'Maturidade Fisiológica', 'MATURIDADE_FISIOLOGICA');
INSERT INTO produto.estadios_fenologicos (id_grupo_estadio_fenologico, cd_estadio_fenologico, ds_nome_estadio_fenologico, ds_chave)
                                  VALUES ($idParent, 'E', 'Pós Maturidade Fisiológica (planta seca)', 'POS_MATURIDADE_FISIOLOGICA');
SQL
        );
    }

    private function upLf042()
    {
        $this->execute(<<<SQL
CREATE TABLE regulacao.lf042 (
	id SERIAL NOT NULL,
	id_laudo_final INTEGER NOT NULL,
	CONSTRAINT pk_lf042 PRIMARY KEY (id),
	CONSTRAINT fk_lf042_laudos_finais FOREIGN KEY (id_laudo_final) REFERENCES sinistro.laudos_finais(id) ON UPDATE CASCADE ON DELETE CASCADE
) INHERITS (public.campos_default);
SQL
        );
    }

    private function upLf042ItensSegurados()
    {
        $this->execute(<<<SQL
CREATE TABLE regulacao.lf042_itens_segurados (
	id SERIAL NOT NULL,
	id_laudo_final_item_segurado INTEGER NOT NULL,
	fl_amostragem_maquina BOOLEAN NOT NULL,
	id_estadio_fenologico INTEGER NOT NULL,
	vl_pragas_doencas_outros NUMERIC(10, 2),
	CONSTRAINT pk_lf042_itens_segurados PRIMARY KEY (id),
	CONSTRAINT fk_lf042_itens_segurados_laudos_finais_itens_segurados FOREIGN KEY (id_laudo_final_item_segurado) REFERENCES sinistro.laudos_finais_itens_segurados(id) ON UPDATE CASCADE ON DELETE CASCADE,
	CONSTRAINT fk_lf042_itens_segurados_estadios_fenologicos FOREIGN KEY (id_estadio_fenologico) REFERENCES produto.estadios_fenologicos(id) 
) INHERITS (public.campos_default);
SQL
        );
    }

    private function upLf042ItensSeguradosAmostras()
    {
        $this->execute(<<<SQL
CREATE TABLE regulacao.lf042_itens_segurados_amostras (
	id SERIAL NOT NULL,
	id_laudo_final_item_segurado INTEGER NOT NULL,
	nr_amostra INTEGER NOT NULL,
	vl_espacamento_entre_linhas NUMERIC(10, 2),
	vl_metros_linhas_colhidos NUMERIC(10, 2),
	vl_producao_colhida_amostra NUMERIC(11, 3),
	vl_producao_kilos_hectare NUMERIC(10, 2),
	vl_largura_plataforma NUMERIC(10, 2),
	vl_distancia_percorrida NUMERIC(10, 2),
	vl_area_colhida NUMERIC(12, 3),
	CONSTRAINT pk_lf042_itens_segurados_amostras PRIMARY KEY (id),
	CONSTRAINT fk_lf042_itens_segurados_amostras_laudos_finais_itens_segurados FOREIGN KEY (id_laudo_final_item_segurado) REFERENCES sinistro.laudos_finais_itens_segurados(id) ON UPDATE CASCADE ON DELETE CASCADE
) INHERITS (public.campos_default);
SQL
        );
    }

    private function upLiberarAcoesPerfil()
    {
        $queryParentLaudo = $this->query("SELECT id FROM sistema.acao WHERE ds_label = 'Laudo Final LF042' AND ds_module = 'regulacao' AND ds_controller = 'lf042'");
        $rowsLaudo = $queryParentLaudo->fetchAll();
        $idParentLaudo = $rowsLaudo[0]['id'];

        $queryParentItemSegurado = $this->query("SELECT id FROM sistema.acao WHERE ds_label = 'Item Segurado' AND ds_module = 'regulacao' AND ds_controller = 'lf042itemsegurado'");
        $rowsItemSegurado = $queryParentItemSegurado->fetchAll();
        $idParentItemSegurado = $rowsItemSegurado[0]['id'];

        $this->execute(<<<SQL
INSERT INTO sistema.roles_acao (id_role, id_acao, fl_permitido) VALUES (16, $idParentLaudo, true);
INSERT INTO sistema.roles_acao (id_role, id_acao, fl_permitido) VALUES (16, $idParentItemSegurado, true);

INSERT INTO sistema.roles_acao (id_role, id_acao, fl_permitido) VALUES (18, $idParentLaudo, true);
INSERT INTO sistema.roles_acao (id_role, id_acao, fl_permitido) VALUES (18, $idParentItemSegurado, true);
SQL
);
    }

    private function downAcao()
    {
        $this->execute(<<<SQL
DELETE FROM sistema.acao WHERE ds_label = 'Laudo Final LF042' AND ds_module = 'regulacao' AND ds_controller = 'lf042';
DELETE FROM sistema.acao WHERE ds_label = 'Item Segurado' AND ds_module = 'regulacao' AND ds_controller = 'lf042itemsegurado';
SQL
        );
    }

    private function downGrupoEstadiosFenologicos()
    {
        $this->execute(<<<SQL
DELETE FROM produto.grupos_estadios_fenologicos WHERE ds_nome_grupo = 'Milho Silagem' AND ds_chave_grupo = 'MILHO_SILAGEM';
SQL
        );
    }

    private function downEstadiosFenologicos()
    {
        $queryParent = $this->query("SELECT id FROM produto.grupos_estadios_fenologicos WHERE ds_nome_grupo = 'Milho Silagem' AND ds_chave_grupo = 'MILHO_SILAGEM'");
        $rows = $queryParent->fetchAll();
        $idParent = $rows[0]['id'];

        $this->execute(<<<SQL
DELETE FROM produto.estadios_fenologicos WHERE id_grupo_estadio_fenologico = $idParent;
SQL
        );
    }

    private function downLf042()
    {
        $this->execute(<<<SQL
DROP TABLE regulacao.lf042;
SQL
        );
    }

    private function downLf042ItensSegurados()
    {
        $this->execute(<<<SQL
DROP TABLE regulacao.lf042_itens_segurados;
SQL
        );
    }

    private function downLf042ItensSeguradosAmostras()
    {
        $this->execute(<<<SQL
DROP TABLE regulacao.lf042_itens_segurados_amostras;
SQL
        );
    }

    private function downLiberarAcoesPerfil()
    {
        $queryParentLaudo = $this->query("SELECT id FROM sistema.acao WHERE ds_label = 'Laudo Final LF042' AND ds_module = 'regulacao' AND ds_controller = 'lf042'");
        $rowsLaudo = $queryParentLaudo->fetchAll();
        $idParentLaudo = $rowsLaudo[0]['id'];

        $queryParentItemSegurado = $this->query("SELECT id FROM sistema.acao WHERE ds_label = 'Item Segurado' AND ds_module = 'regulacao' AND ds_controller = 'lf042itemsegurado'");
        $rowsItemSegurado = $queryParentItemSegurado->fetchAll();
        $idParentItemSegurado = $rowsItemSegurado[0]['id'];

        $this->execute(<<<SQL
DELETE FROM sistema.roles_acao WHERE id_role in(16, 18) and id_acao in($idParentLaudo, $idParentItemSegurado);
SQL
        );
    }
}
