<?php
declare(strict_types=1);

use Phinx\Migration\AbstractMigration;

final class Task2011111609 extends AbstractMigration
{
    public function up(): void
    {
        $this->estruturaTaxaUp();
        $this->estruturaComercializacaoUp();
        $this->upPropostasTaxaAgrupamento();
    }

    public function down(): void
    {
        $this->estruturaTaxaDown();
        $this->estruturaComercializacaoDown();
        $this->downPropostasTaxaAgrupamento();
    }

    private function estruturaTaxaUp()
    {
        $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 ('Orçamento', 'comercializacao', 'taxaorcamento', 'index', '', 58, '', 'Taxa por Orçamento', 'M', '2020-11-19 11:59:43', 3379, nextval('sistema.acao_id_seq'::regclass));

CREATE TABLE comercializacao.taxas_agrupamento_orcamentos (
    id_taxa_agrupamento INTEGER NOT NULL,
    id_proposta INTEGER NOT NULL,

    CONSTRAINT pk_taxas_agrupamento_orcamentos PRIMARY KEY (id_taxa_agrupamento, id_proposta),
    CONSTRAINT fk_taxas_agrupamento_orcamentos_propostas FOREIGN KEY (id_proposta) REFERENCES seguro.propostas (id),
    CONSTRAINT fk_taxas_agrupamento_orcamentos_taxas_agrupamento FOREIGN KEY (id_taxa_agrupamento) REFERENCES comercializacao.taxas_agrupamento (id)
)
INHERITS (public.campos_default);

CREATE TRIGGER log_to_auditoria_taxa_agrupamento_orcamento AFTER INSERT OR DELETE OR UPDATE ON comercializacao.taxas_agrupamento_orcamentos FOR EACH ROW EXECUTE PROCEDURE log.log_to_auditoria();
SQL
        );

        $queryParent = $this->query("SELECT id FROM sistema.acao WHERE ds_label = 'Orçamento' AND ds_module = 'comercializacao' AND ds_controller = 'taxaorcamento'");
        $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, nr_ordem, fl_tipo, dt_criacao, id_usuario_criacao, id) VALUES ('Editar', 'comercializacao', 'taxaorcamento', 'form', 'id', $idParent, 'edit.png', '0', 'L', '2020-11-19 11:59:43', 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', 'comercializacao', 'taxaorcamento', 'active', 'id', $idParent, 'active.png', '1', 'L', '2020-11-19 11:59:43', 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', 'comercializacao', 'taxaorcamento', 'delete', 'id', $idParent, 'delete.png', '2', 'L', '2020-11-19 11:59:43', 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 ('Relacionar Orçamentos', 'comercializacao', 'relacionartaxaorcamento', 'index', 'id', $idParent, 'relaciona_orcamento.png', 'Relacionar Orçamentos', 'L', '2020-11-19 14:57:46', 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 ('Relacionar Proponentes', 'seguro', 'proponente', 'relacionaproponente', '', $idParent, 'relaciona_usuario.png', 'Relacionar Proponentes', 'L', '2020-11-19 16:02:37', 3379, nextval('sistema.acao_id_seq'::regclass));
SQL
        );
    }

    private function estruturaTaxaDown()
    {
        $this->execute(<<<SQL
delete from sistema.acao where ds_module = 'comercializacao' and ds_controller = 'taxaorcamento';
delete from sistema.acao where ds_module = 'comercializacao' and ds_controller = 'relacionartaxaorcamento';
delete from sistema.acao where ds_module = 'comercializacao' and ds_controller = 'relacionaproponente';

drop trigger log_to_auditoria_taxa_agrupamento_orcamento on comercializacao.taxas_agrupamento_orcamentos;
drop table comercializacao.taxas_agrupamento_orcamentos;
SQL
        );
    }

    private function estruturaComercializacaoUp()
    {
        $this->execute(<<<SQL
CREATE TABLE comercializacao.comercializacoes_orcamentos (
    id_comercializacao INTEGER NOT NULL,
    id_proposta INTEGER NOT NULL,

    CONSTRAINT pk_comercializacoes_orcamentos PRIMARY KEY (id_comercializacao, id_proposta),
    CONSTRAINT fk_comercializacoes_orcamentos_propostas FOREIGN KEY (id_proposta) REFERENCES seguro.propostas (id),
    CONSTRAINT fk_comercializacoes_orcamentos_taxas_agrupamento FOREIGN KEY (id_comercializacao) REFERENCES comercializacao.comercializacoes (id)
)
INHERITS (public.campos_default);

CREATE TRIGGER log_to_auditoria_comercializacoes_orcamentos AFTER INSERT OR DELETE OR UPDATE ON comercializacao.comercializacoes_orcamentos FOR EACH ROW EXECUTE PROCEDURE log.log_to_auditoria();

alter table comercializacao.comercializacoes drop constraint ckc_tipo_comercializacao, add constraint ckc_tipo_comercializacao CHECK(tp_comercializacao = ANY (ARRAY['M'::bpchar, 'P'::bpchar, 'E'::bpchar, 'U'::bpchar, 'O'::bpchar]));

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 ('Orçamento', 'comercializacao', 'orcamento', 'index', '', 49, '', 'Comercialização por Orçamento', 'M', '2020-11-23 15:56:07', 3379, nextval('sistema.acao_id_seq'::regclass));
SQL
        );

        $queryParent = $this->query("SELECT id FROM sistema.acao WHERE ds_label = 'Orçamento' AND ds_module = 'comercializacao' AND ds_controller = 'orcamento'");
        $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, nr_ordem, fl_tipo, dt_criacao, id_usuario_criacao, id) VALUES ('Editar', 'comercializacao', 'orcamento', 'form', 'id', $idParent, 'edit.png', '0', 'L', '2020-11-23 15:56:07', 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', 'comercializacao', 'orcamento', 'active', 'id', $idParent, 'active.png', '1', 'L', '2020-11-23 15:56:07', 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', 'comercializacao', 'orcamento', 'delete', 'id', $idParent, 'delete.png', '2', 'L', '2020-11-23 15:56:07', 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 ('Relacionar Orçamentos', 'comercializacao', 'relacionarorcamento', 'index', '', $idParent, '', 'Relacionar Orçamentos', 'L', '2020-11-23 17:54:10', 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 ('Visualizar', 'comercializacao', 'orcamento', 'view', 'id', $idParent, 'view.png', 'Visualizar', 'L', '2021-03-03 11:25:04', 3379, nextval('sistema.acao_id_seq'::regclass));
SQL
);
    }

    private function estruturaComercializacaoDown()
    {
        $this->execute(<<<SQL
drop trigger log_to_auditoria_comercializacoes_orcamentos on comercializacao.comercializacoes_orcamentos;
drop table comercializacao.comercializacoes_orcamentos;

delete from sistema.acao where ds_module = 'comercializacao' and ds_controller = 'orcamento';
SQL
        );
    }

    private function upPropostasTaxaAgrupamento()
    {
        $this->execute(<<<SQL
CREATE TABLE seguro.propostas_taxas_agrupamento (
    id_proposta INTEGER NOT NULL,
    id_taxa_agrupamento INTEGER NOT NULL,

    CONSTRAINT pk_propostas_taxas_agrupamento PRIMARY KEY (id_proposta, id_taxa_agrupamento),
    CONSTRAINT fk_propostas_taxas_agrupamento_propostas FOREIGN KEY (id_proposta) REFERENCES seguro.propostas (id),
    CONSTRAINT fk_propostas_taxas_agrupamento_taxas_agrupamento FOREIGN KEY (id_taxa_agrupamento) REFERENCES comercializacao.taxas_agrupamento (id)
)
INHERITS (public.campos_default);
SQL
);
    }

    private function downPropostasTaxaAgrupamento()
    {
        $this->execute(<<<SQL
drop table seguro.propostas_taxas_agrupamento;
SQL
        );
    }
}
