<?php
declare(strict_types=1);

use Phinx\Migration\AbstractMigration;

final class Task2303311628 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, ds_descricao, fl_tipo, dt_criacao, id_usuario_criacao, id) VALUES ('Início de Cobertura', 'produto', 'validacoesiniciocobertura', 'index', '', 47, '', 'Início de Cobertura', 'M', '2023-04-25 14:12:42', 3379, nextval('sistema.acao_id_seq'::regclass));
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 ('Início de Cobertura', 'relatorio', 'tecnica', 'iniciocobertura', 'forminiciocobertura', 709, '', 'Início de Cobertura', 'R', '2023-04-25 14:22:07', 3379, nextval('sistema.acao_id_seq'::regclass));
SQL
);

        $idParentMenu = $this->getIdParentMenu();
        $idParentRelatorio = $this->getIdParentRelatorio();

        $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', 'produto', 'validacoesiniciocobertura', 'form', 'id', {$idParentMenu}, 'edit.png', '0', 'L', '2023-04-25 14:12:42', 3379, 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', 'produto', 'validacoesiniciocobertura', 'active', 'id', {$idParentMenu}, 'active.png', '1', 'L', '2023-04-25 14:12:42', 3379, 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', 'produto', 'validacoesiniciocobertura', 'delete', 'id', {$idParentMenu}, 'delete.png', '2', 'L', '2023-04-25 14:12:42', 3379, nextval('sistema.acao_id_seq'::regclass));

INSERT INTO sistema.roles_acao
     SELECT 2068 as id_usuario_criacao,
            null as id_usuario_alteracao,
            now() as dt_criacao,
            null as dt_alteracao,
            true as fl_ativo,
            false as fl_del,
            20 as id_role,
            id as id_acao,
            true as fl_permitido
       FROM sistema.acao
      WHERE id in ({$idParentMenu}, {$idParentRelatorio})
         OR id_parent = {$idParentMenu};
SQL
        );

        $this->execute(<<<SQL
CREATE TABLE produto.tipos_validacoes_inicio_cobertura (
    id SERIAL,
    ds_descricao VARCHAR(100) NOT NULL,
    ds_chave VARCHAR(100) NOT NULL,
    CONSTRAINT pk_tipos_validacoes_inicio_cobertura PRIMARY KEY (id)
) INHERITS (public.campos_default);

CREATE TABLE produto.validacoes_inicio_cobertura (
    id SERIAL,
    ds_nome VARCHAR(100) NOT NULL,
    id_cultura INT NOT NULL,
    id_tipo_validacao INT NOT NULL,
    ds_descricao TEXT,
    CONSTRAINT pk_validacoes_inicio_cobertura PRIMARY KEY (id),
    CONSTRAINT fk_validacoes_inicio_cobertura_cultura FOREIGN KEY (id_cultura) REFERENCES produto.culturas (id),
    CONSTRAINT fk_validacoes_inicio_cobertura_tipo_validacao FOREIGN KEY (id_tipo_validacao) REFERENCES produto.tipos_validacoes_inicio_cobertura (id)
) INHERITS (public.campos_default);

CREATE TABLE produto.validacoes_inicio_cobertura_municipios (
    id SERIAL,
    id_validacao_inicio_cobertura INT NOT NULL,
    id_municipio INT NOT NULL,
    CONSTRAINT pk_validacoes_inicio_cobertura_municipios PRIMARY KEY (id),
    CONSTRAINT fk_validacoes_inicio_cobertura_municipios_validacoes FOREIGN KEY (id_validacao_inicio_cobertura) REFERENCES produto.validacoes_inicio_cobertura (id),
    CONSTRAINT fk_validacoes_inicio_cobertura_municipios_municipios FOREIGN KEY (id_municipio) REFERENCES sistema.municipios (id)
) INHERITS (public.campos_default);

INSERT INTO produto.tipos_validacoes_inicio_cobertura (id, ds_descricao, ds_chave) VALUES (1, 'Data da Poda', 'DATA_PODA'),
                                                                                          (2, 'Data da Semeadura ou Transplante', 'DATA_SEMEADURA_TRANSPLANTE'),
                                                                                          (3, 'Data da Semeadura', 'DATA_SEMEADURA'),
                                                                                          (4, 'Data Fixa', 'DATA_FIXA'),
                                                                                          (5, 'Início de Vigência', 'INICIO_VIGENCIA');
SQL
        );
    }

    public function down(): void
    {
        $idParentMenu = $this->getIdParentMenu();
        $idParentRelatorio = $this->getIdParentRelatorio();

        $this->execute(<<<SQL
DROP TABLE produto.validacoes_inicio_cobertura_municipios;
DROP TABLE produto.validacoes_inicio_cobertura;
DROP TABLE produto.tipos_validacoes_inicio_cobertura;

DELETE FROM sistema.roles_acao sra
      USING sistema.acao sa
      WHERE sa.id = sra.id_acao
        AND sa.id_parent = {$idParentMenu};

DELETE FROM sistema.roles_acao WHERE id_acao = {$idParentMenu};

DELETE FROM sistema.acao WHERE id_parent = {$idParentMenu};
DELETE FROM sistema.acao WHERE id = {$idParentMenu};
DELETE FROM sistema.acao WHERE id = {$idParentRelatorio};
SQL
);
    }

    private function getIdParentMenu()
    {
        $queryParent = $this->query("SELECT id FROM sistema.acao WHERE ds_module = 'produto' AND ds_controller = 'validacoesiniciocobertura' AND ds_action = 'index'");
        $rows = $queryParent->fetchAll();

        return $rows[0]['id'];
    }

    private function getIdParentRelatorio()
    {
        $queryParent = $this->query("SELECT id FROM sistema.acao WHERE ds_module = 'relatorio' AND ds_controller = 'tecnica' AND ds_action = 'iniciocobertura'");
        $rows = $queryParent->fetchAll();

        return $rows[0]['id'];
    }
}
