<?php
declare(strict_types=1);

use Phinx\Migration\AbstractMigration;

final class Task2106111448 extends AbstractMigration
{
    public function up(): void
    {
        $this->upTabelas();
        $this->upMenus();
    }

    public function down(): void
    {
        $this->execute(<<<SQL
            DROP INDEX seguro.idx_propostas_email_justificativa_propostas;
            DROP INDEX seguro.idx_propostas_docusign_propostas;
            DROP INDEX seguro.idx_propostas_tipo_assinatura_documento_propostas;
            DELETE FROM sistema.roles_acao WHERE id_acao in (SELECT id FROM sistema.acao WHERE ds_controller = 'propostastipoassinaturadocumento'  AND ds_action = 'index' AND ds_label = 'Assinaturas Pendentes');
            DELETE FROM sistema.acao WHERE ds_controller = 'propostastipoassinaturadocumento'  AND ds_action = 'index' AND ds_label = 'Assinaturas Pendentes';
            ALTER TABLE produto.produtos_coberturas DROP COLUMN fl_assinatura_segurado;
            DROP TABLE seguro.propostas_email_justificativa;
            DROP TABLE seguro.propostas_docusign;
            DROP TABLE seguro.propostas_email_assinatura_documento;
            DROP TABLE seguro.propostas_tipo_assinatura_documento;
            ALTER TABLE seguro.propostas_beneficiarios DROP COLUMN ds_email_beneficiario;
            ALTER TABLE seguro.propostas_beneficiarios DROP COLUMN ds_email_instituicao_financeira;
SQL
);
    }

    private function upMenus()
    {
        $this->execute(<<<SQL
            INSERT INTO sistema.acao (
                ds_label, 
                ds_module, 
                ds_controller, 
                ds_action,
                id_parent,
                ds_descricao,
                fl_tipo,
                id
            ) VALUES (
                'Assinaturas Pendentes', 
                'seguro', 
                'propostastipoassinaturadocumento', 
                'index',
                27,
                'Assinaturas Pendentes',
                'M',
                nextval('sistema.acao_id_seq'::regclass)
            );

            INSERT INTO sistema.roles_acao(id_role, id_acao) VALUES (2,  (SELECT id FROM sistema.acao WHERE ds_controller = 'propostastipoassinaturadocumento'  AND ds_action = 'index' AND ds_label = 'Assinaturas Pendentes'));
            INSERT INTO sistema.roles_acao(id_role, id_acao) VALUES (3,  (SELECT id FROM sistema.acao WHERE ds_controller = 'propostastipoassinaturadocumento'  AND ds_action = 'index' AND ds_label = 'Assinaturas Pendentes'));
            INSERT INTO sistema.roles_acao(id_role, id_acao) VALUES (4,  (SELECT id FROM sistema.acao WHERE ds_controller = 'propostastipoassinaturadocumento'  AND ds_action = 'index' AND ds_label = 'Assinaturas Pendentes'));
            INSERT INTO sistema.roles_acao(id_role, id_acao) VALUES (5,  (SELECT id FROM sistema.acao WHERE ds_controller = 'propostastipoassinaturadocumento'  AND ds_action = 'index' AND ds_label = 'Assinaturas Pendentes'));
            INSERT INTO sistema.roles_acao(id_role, id_acao) VALUES (6,  (SELECT id FROM sistema.acao WHERE ds_controller = 'propostastipoassinaturadocumento'  AND ds_action = 'index' AND ds_label = 'Assinaturas Pendentes'));
            INSERT INTO sistema.roles_acao(id_role, id_acao) VALUES (12, (SELECT id FROM sistema.acao WHERE ds_controller = 'propostastipoassinaturadocumento'  AND ds_action = 'index' AND ds_label = 'Assinaturas Pendentes'));
            INSERT INTO sistema.roles_acao(id_role, id_acao) VALUES (16, (SELECT id FROM sistema.acao WHERE ds_controller = 'propostastipoassinaturadocumento'  AND ds_action = 'index' AND ds_label = 'Assinaturas Pendentes'));
            INSERT INTO sistema.roles_acao(id_role, id_acao) VALUES (19, (SELECT id FROM sistema.acao WHERE ds_controller = 'propostastipoassinaturadocumento'  AND ds_action = 'index' AND ds_label = 'Assinaturas Pendentes'));
            INSERT INTO sistema.roles_acao(id_role, id_acao) VALUES (23, (SELECT id FROM sistema.acao WHERE ds_controller = 'propostastipoassinaturadocumento'  AND ds_action = 'index' AND ds_label = 'Assinaturas Pendentes'));
            INSERT INTO sistema.roles_acao(id_role, id_acao) VALUES (20, (SELECT id FROM sistema.acao WHERE ds_controller = 'propostastipoassinaturadocumento'  AND ds_action = 'index' AND ds_label = 'Assinaturas Pendentes'));
            INSERT INTO sistema.roles_acao(id_role, id_acao) VALUES (26, (SELECT id FROM sistema.acao WHERE ds_controller = 'propostastipoassinaturadocumento'  AND ds_action = 'index' AND ds_label = 'Assinaturas Pendentes'));

SQL
);
    }

    private function upTabelas()
    {
        $this->execute(<<<SQL

        CREATE TABLE seguro.propostas_tipo_assinatura_documento(
            id SERIAL,
            id_proposta INTEGER NOT NULL,
            tipo_assinatura INTEGER NOT NULL,
            CONSTRAINT pk_propostas_tipo_assinatura_documento PRIMARY KEY(id),
            CONSTRAINT fk_propostas_tipo_assinatura_documento_propostas FOREIGN KEY (id_proposta) REFERENCES seguro.propostas (id)
        ) INHERITS (public.campos_default);

        CREATE INDEX idx_propostas_tipo_assinatura_documento_propostas ON seguro.propostas_tipo_assinatura_documento(id_proposta);

        ALTER TABLE produto.produtos_coberturas ADD COLUMN fl_assinatura_segurado BOOLEAN DEFAULT false;

        --  Só é valido para endosso transmitido (fl_ativo true)
        -- No endosso, crio o registro e enqto não for transmitido vou dando update. Após transmitido a manutenção será na aba "E-mail Assinaturas", 
        -- onde sempre tenho que criar um novo registro e marcar os demais da proposta como fl_ativo false, para guardar o histórico de alteração.
        CREATE TABLE seguro.propostas_email_assinatura_documento (
            id SERIAL,
            id_proposta INTEGER NOT NULL,
            ds_email_segurado VARCHAR,
            ds_email_beneficiarios jsonb, -- '[{"id" : 1, "email": "andre.mello@agrobrasilseguros.com.br", "email_instituicao_financeira": "instituicao@financeira.com.br"}]'
            CONSTRAINT pk_propostas_email_assinatura_documento PRIMARY KEY(id),
            CONSTRAINT fk_propostas_email_assinatura_documento_propostas FOREIGN KEY (id_proposta) REFERENCES seguro.propostas (id)
        ) INHERITS (public.campos_default);

        CREATE TABLE seguro.propostas_docusign(
            id SERIAL,
            id_proposta INTEGER NOT NULL,
            id_envelope VARCHAR NOT NULL,
            ds_status VARCHAR NOT NULL,
            id_proposta_email_assinatura_documento INT NOT NULL,
            CONSTRAINT pk_propostas_docusign PRIMARY KEY(id),
            CONSTRAINT fk_propostas_docusign_propostas FOREIGN KEY (id_proposta) REFERENCES seguro.propostas (id),
            CONSTRAINT fk_propostas_docusign_propostas_email_assinatura_documento FOREIGN KEY (id_proposta_email_assinatura_documento) REFERENCES seguro.propostas_email_assinatura_documento (id)
        ) INHERITS (public.campos_default);

        CREATE INDEX idx_propostas_docusign_propostas ON seguro.propostas_docusign(id_proposta);

        -- Sempre que adicionar nessa tabela, lembrar de dar manutenção na tabela seguro.propostas_email_assinatura_documento
        ALTER TABLE seguro.propostas_beneficiarios ADD COLUMN ds_email_beneficiario varchar(255);
        ALTER TABLE seguro.propostas_beneficiarios ADD COLUMN ds_email_instituicao_financeira varchar(255);

        -- SELECT id, arr->>'email'
        -- FROM seguro.testejson, jsonb_array_elements(campojson) as arr
        -- WHERE arr->>'id' = '2';

        CREATE TABLE seguro.propostas_email_justificativa(
            id SERIAL,
            id_proposta INTEGER NOT NULL,
            id_proposta_email_assinatura_documento INTEGER,
            nr_justificativa INTEGER NOT NULL,
            ds_justificativa TEXT,
            CONSTRAINT pk_propostas_email_justificativa PRIMARY KEY(id),
            CONSTRAINT fk_propostas_email_justificativa FOREIGN KEY (id_proposta) REFERENCES seguro.propostas (id)
        ) INHERITS (public.campos_default);

        CREATE INDEX idx_propostas_email_justificativa_propostas ON seguro.propostas_email_justificativa(id_proposta);

        ALTER TABLE seguro.propostas_docusign ALTER COLUMN id_envelope DROP NOT NULL;
        ALTER TABLE seguro.propostas_docusign ADD COLUMN ds_mensagem VARCHAR;
        ALTER TABLE seguro.propostas_docusign ADD COLUMN st_tipo_envio CHAR(1);
        ALTER TABLE seguro.propostas_docusign ADD CONSTRAINT ckc_tipo_envio CHECK(st_tipo_envio IN('', 'P', 'E', 'R', 'C'));
        COMMENT ON COLUMN seguro.propostas_docusign.st_tipo_envio IS 'P: proposta E: endosso R: recusa proposta C: cancelamento apolice';
SQL
);
    }

}
