<?php

declare(strict_types=1);

use Phinx\Migration\AbstractMigration;

final class TaskSr47550 extends AbstractMigration
{
    public function up(): void
    {
        $this->execute(<<<SQL
            CREATE TABLE sinistro.tipo_despesa (
                id SERIAL,
                ds_tipo_despesa VARCHAR(60) NOT NULL,
                ds_unidade VARCHAR(10) NOT NULL,
                CONSTRAINT pk_tipo_despesa PRIMARY KEY(id)
            ) INHERITS (public.campos_default);

            CREATE TABLE sinistro.parametro_tipo_despesa (
                id SERIAL,
                id_tipo_despesa INTEGER NOT NULL,
                ds_parametro_tipo_despesa VARCHAR(40) NOT NULL,
                vl_minimo NUMERIC(10, 2) NULL DEFAULT NULL,
                vl_maximo NUMERIC(10, 2) NULL DEFAULT NULL,
                fl_anexo_obrigatorio BOOLEAN DEFAULT FALSE,
                CONSTRAINT pk_parametro_tipo_despesa PRIMARY KEY (id),
                CONSTRAINT fk_id_tipo_despesa FOREIGN KEY (id_tipo_despesa) REFERENCES sinistro.tipo_despesa (id) 
            ) INHERITS (public.campos_default);

            CREATE TABLE sinistro.parametro_tipo_despesa_estado (
                id_parametro_tipo_despesa INTEGER,
                id_estado INTEGER,
                CONSTRAINT pk_parametro_tipo_despesa_estado PRIMARY KEY (id_parametro_tipo_despesa, id_estado),
                CONSTRAINT fk_id_parametro_tipo_despesa FOREIGN KEY (id_parametro_tipo_despesa) REFERENCES sinistro.parametro_tipo_despesa (id),
                CONSTRAINT fk_id_estado FOREIGN KEY (id_estado) REFERENCES sistema.estados (id)
            ) INHERITS (public.campos_default);

            INSERT INTO sinistro.tipo_despesa (id, ds_tipo_despesa, ds_unidade) VALUES (1, 'Km', 'Km');
            INSERT INTO sinistro.parametro_tipo_despesa(id_tipo_despesa, ds_parametro_tipo_despesa, fl_anexo_obrigatorio, vl_maximo) VALUES(1, 'Km', TRUE, 1000);

            INSERT INTO sinistro.parametro_tipo_despesa_estado (id_parametro_tipo_despesa, id_estado)
            SELECT 1, id
            FROM sistema.estados
            WHERE fl_ativo IS TRUE;
            
            INSERT INTO sinistro.tipo_despesa (id, ds_tipo_despesa, ds_unidade) VALUES (2, 'Pedágio', 'R$');
            INSERT INTO sinistro.parametro_tipo_despesa(id_tipo_despesa, ds_parametro_tipo_despesa) VALUES(2, 'Pedágio');
            INSERT INTO sinistro.parametro_tipo_despesa_estado (id_parametro_tipo_despesa, id_estado)
            SELECT 2, id
            FROM sistema.estados
            WHERE fl_ativo IS TRUE;
            
            INSERT INTO sinistro.tipo_despesa (id, ds_tipo_despesa, ds_unidade) VALUES (3, 'Hotel', 'R$');
            INSERT INTO sinistro.parametro_tipo_despesa(id_tipo_despesa, ds_parametro_tipo_despesa) VALUES(3, 'Hotel');
            INSERT INTO sinistro.parametro_tipo_despesa_estado (id_parametro_tipo_despesa, id_estado)
            SELECT 3, id
            FROM sistema.estados
            WHERE fl_ativo IS TRUE;
            
            INSERT INTO sinistro.tipo_despesa (id, ds_tipo_despesa, ds_unidade) VALUES (4, 'Alimentação', 'R$');
            INSERT INTO sinistro.parametro_tipo_despesa(id_tipo_despesa, ds_parametro_tipo_despesa) VALUES(4, 'Alimentação');
            INSERT INTO sinistro.parametro_tipo_despesa_estado (id_parametro_tipo_despesa, id_estado)
            SELECT 4, id
            FROM sistema.estados
            WHERE fl_ativo IS TRUE;

            SELECT setval('sinistro.tipo_despesa_id_seq'::regclass, (SELECT MAX(id) FROM sinistro.tipo_despesa));

            CREATE TABLE sinistro.vistoriador_despesa (
                id SERIAL,
                id_funcionario INTEGER NOT NULL,
                id_proposta INTEGER NOT NULL,
                id_vistoria INTEGER NULL DEFAULT NULL,
                id_parametro_tipo_despesa INTEGER NOT NULL,
                id_estado INTEGER NOT NULL,
                dt_despesa TIMESTAMP WITHOUT TIME ZONE NOT NULL,
                vl_despesa NUMERIC (10, 2) NOT NULL,
                ds_justificativa TEXT,
                CONSTRAINT pk_vistoriador_despesa PRIMARY KEY (id),
                CONSTRAINT fk_id_funcionario FOREIGN KEY (id_funcionario) REFERENCES sistema.funcionarios (id),
                CONSTRAINT fk_id_parametro_tipo_despesa FOREIGN KEY (id_parametro_tipo_despesa) REFERENCES sinistro.parametro_tipo_despesa (id),
                CONSTRAINT fk_id_estado FOREIGN KEY (id_estado) REFERENCES sistema.estados (id),
                CONSTRAINT fk_id_vistoria FOREIGN KEY (id_vistoria) REFERENCES sistema.vistorias (id),
                CONSTRAINT fk_id_proposta FOREIGN KEY (id_proposta) REFERENCES seguro.propostas (id)
            ) INHERITS (public.campos_default);

            CREATE TABLE sinistro.vistoriador_despesa_arquivo (
                id SERIAL,
                id_vistoriador_despesa INTEGER NOT NULL,
                ds_caminho_arquivo VARCHAR NOT NULL,
                CONSTRAINT pk_vistoriador_despesa_arquivo PRIMARY KEY(id),
                CONSTRAINT fk_id_vistoriador_despesa FOREIGN KEY (id_vistoriador_despesa) REFERENCES sinistro.vistoriador_despesa (id)
            ) INHERITS (public.campos_default);
            
            -- AÇÕES / PERMISSÕES TIPOS DE DESPESA

            INSERT INTO
                sistema.acao (
                    dt_criacao,
                    ds_label,
                    ds_module,
                    ds_controller,
                    ds_action,
                    id_parent,
                    ds_descricao,
                    fl_tipo,
                    id
                )
            VALUES
                (
                    now(),
                    'Parâmetros Tipos Despesa',
                    'sinistro2',
                    'parametrotipodespesa',
                    'index',
                    (SELECT id FROM sistema.acao WHERE id_parent = 1662 AND ds_descricao = 'Configurações de Cobrança'),
                    'Parâmetros Tipos Despesa',
                    'M',
                    nextval('sistema.acao_id_seq'::regclass)
                );
            
            INSERT INTO sistema.roles_acao (id_role, id_acao) VALUES(16, currval('sistema.acao_id_seq'));

            INSERT INTO
                sistema.acao (
                    dt_criacao,
                    ds_label,
                    ds_module,
                    ds_controller,
                    ds_action,
                    id_parent,
                    ds_descricao,
                    fl_tipo,
                    id
                )
            VALUES
                (
                    now(),
                    'Editar',
                    'sinistro2',
                    'parametrotipodespesa',
                    'form',
                    (SELECT id FROM sistema.acao WHERE ds_module = 'sinistro2' AND ds_descricao = 'Parâmetros Tipos Despesa'),
                    'Ação para edição de Tipos de Despesa',
                    'L',
                    nextval('sistema.acao_id_seq'::regclass)
                );
            
            INSERT INTO sistema.roles_acao (id_role, id_acao) VALUES(16, currval('sistema.acao_id_seq'));
            
            INSERT INTO
                sistema.acao (
                    dt_criacao,
                    ds_label,
                    ds_module,
                    ds_controller,
                    ds_action,
                    id_parent,
                    ds_descricao,
                    fl_tipo,
                    id
                )
            VALUES
                (
                    now(),
                    'Deletar',
                    'sinistro2',
                    'parametrotipodespesa',
                    'delete',
                    (SELECT id FROM sistema.acao WHERE ds_module = 'sinistro2' AND ds_descricao = 'Parâmetros Tipos Despesa'),
                    'Ação para remover registro de Tipos de Despesa',
                    'L',
                    nextval('sistema.acao_id_seq'::regclass)
                );

            -- AÇÕES / PERMISSÕES ANEXAR COMPROVANTES DE DESPESAS

             INSERT INTO
                sistema.acao (
                    dt_criacao,
                    ds_label,
                    ds_module,
                    ds_controller,
                    ds_action,
                    id_parent,
                    ds_descricao,
                    fl_tipo,
                    id
                )
            VALUES
                (
                    now(),
                    'Anexar Comprovantes de Despesas',
                    'sinistro2',
                    'vistoriadordespesa',
                    'index',
                    1662,
                    'Anexar Comprovantes de Despesas',
                    'L',
                    nextval('sistema.acao_id_seq'::regclass)
                );

            INSERT INTO sistema.roles_acao (id_role, id_acao) VALUES(12, currval('sistema.acao_id_seq'));
            INSERT INTO sistema.roles_acao (id_role, id_acao) VALUES(18, currval('sistema.acao_id_seq'));
            INSERT INTO sistema.roles_acao (id_role, id_acao) VALUES(30, currval('sistema.acao_id_seq'));

            INSERT INTO sistema.usuarios_acao (id_usuario, id_acao) VALUES((SELECT id FROM sistema.usuarios WHERE ds_nome_usuario = 'gabriela.couto' AND tp_usuario = 'F'), currval('sistema.acao_id_seq'));
            INSERT INTO sistema.usuarios_acao (id_usuario, id_acao) VALUES((SELECT id FROM sistema.usuarios WHERE ds_nome_usuario = 'marcia.correa' AND tp_usuario = 'F'), currval('sistema.acao_id_seq'));
            INSERT INTO sistema.usuarios_acao (id_usuario, id_acao) VALUES((SELECT id FROM sistema.usuarios WHERE ds_nome_usuario = 'denise.wittzorecke' AND tp_usuario = 'F'), currval('sistema.acao_id_seq'));
            INSERT INTO sistema.usuarios_acao (id_usuario, id_acao) VALUES((SELECT id FROM sistema.usuarios WHERE ds_nome_usuario = 'tiago.zschornack' AND tp_usuario = 'F'), currval('sistema.acao_id_seq'));
            INSERT INTO sistema.usuarios_acao (id_usuario, id_acao) VALUES((SELECT id FROM sistema.usuarios WHERE ds_nome_usuario = 'gessika.rocha' AND tp_usuario = 'F'), currval('sistema.acao_id_seq'));


            INSERT INTO
                sistema.acao (
                    dt_criacao,
                    ds_label,
                    ds_module,
                    ds_controller,
                    ds_action,
                    id_parent,
                    ds_descricao,
                    fl_tipo,
                    id
                )
            VALUES
                (
                    now(),
                    'Anexar Comprovantes de Despesas',
                    'sinistro2',
                    'vistoriadordespesa',
                    'form',
                    1662,
                    'Anexar Comprovantes de Despesas',
                    'M',
                    nextval('sistema.acao_id_seq'::regclass)
                );

            INSERT INTO sistema.roles_acao (id_role, id_acao) VALUES(12, currval('sistema.acao_id_seq'));
            INSERT INTO sistema.roles_acao (id_role, id_acao) VALUES(18, currval('sistema.acao_id_seq'));
            INSERT INTO sistema.roles_acao (id_role, id_acao) VALUES(30, currval('sistema.acao_id_seq'));

            INSERT INTO sistema.usuarios_acao (id_usuario, id_acao) VALUES((SELECT id FROM sistema.usuarios WHERE ds_nome_usuario = 'gabriela.couto' AND tp_usuario = 'F'), currval('sistema.acao_id_seq'));
            INSERT INTO sistema.usuarios_acao (id_usuario, id_acao) VALUES((SELECT id FROM sistema.usuarios WHERE ds_nome_usuario = 'marcia.correa' AND tp_usuario = 'F'), currval('sistema.acao_id_seq'));
            INSERT INTO sistema.usuarios_acao (id_usuario, id_acao) VALUES((SELECT id FROM sistema.usuarios WHERE ds_nome_usuario = 'denise.wittzorecke' AND tp_usuario = 'F'), currval('sistema.acao_id_seq'));
            INSERT INTO sistema.usuarios_acao (id_usuario, id_acao) VALUES((SELECT id FROM sistema.usuarios WHERE ds_nome_usuario = 'tiago.zschornack' AND tp_usuario = 'F'), currval('sistema.acao_id_seq'));
            INSERT INTO sistema.usuarios_acao (id_usuario, id_acao) VALUES((SELECT id FROM sistema.usuarios WHERE ds_nome_usuario = 'gessika.rocha' AND tp_usuario = 'F'), currval('sistema.acao_id_seq'));

            INSERT INTO
                sistema.acao (
                    dt_criacao,
                    ds_label,
                    ds_module,
                    ds_controller,
                    ds_action,
                    id_parent,
                    ds_descricao,
                    fl_tipo,
                    id
                )
            VALUES
                (
                    now(),
                    'Editar',
                    'sinistro2',
                    'vistoriadordespesa',
                    'form',
                    (SELECT id FROM sistema.acao WHERE ds_module = 'sinistro2' AND ds_descricao = 'Anexar Comprovantes de Despesas' AND ds_action = 'form'),
                    'Ação para edição de Comprovantes de Despesa',
                    'L',
                    nextval('sistema.acao_id_seq'::regclass)
                );
            
            INSERT INTO sistema.roles_acao (id_role, id_acao) VALUES(12, currval('sistema.acao_id_seq'));
            INSERT INTO sistema.roles_acao (id_role, id_acao) VALUES(18, currval('sistema.acao_id_seq'));
            INSERT INTO sistema.roles_acao (id_role, id_acao) VALUES(30, currval('sistema.acao_id_seq'));

            INSERT INTO sistema.usuarios_acao (id_usuario, id_acao) VALUES((SELECT id FROM sistema.usuarios WHERE ds_nome_usuario = 'gabriela.couto' AND tp_usuario = 'F'), currval('sistema.acao_id_seq'));
            INSERT INTO sistema.usuarios_acao (id_usuario, id_acao) VALUES((SELECT id FROM sistema.usuarios WHERE ds_nome_usuario = 'marcia.correa' AND tp_usuario = 'F'), currval('sistema.acao_id_seq'));
            INSERT INTO sistema.usuarios_acao (id_usuario, id_acao) VALUES((SELECT id FROM sistema.usuarios WHERE ds_nome_usuario = 'denise.wittzorecke' AND tp_usuario = 'F'), currval('sistema.acao_id_seq'));
            INSERT INTO sistema.usuarios_acao (id_usuario, id_acao) VALUES((SELECT id FROM sistema.usuarios WHERE ds_nome_usuario = 'tiago.zschornack' AND tp_usuario = 'F'), currval('sistema.acao_id_seq'));
            INSERT INTO sistema.usuarios_acao (id_usuario, id_acao) VALUES((SELECT id FROM sistema.usuarios WHERE ds_nome_usuario = 'gessika.rocha' AND tp_usuario = 'F'), currval('sistema.acao_id_seq'));
            
            INSERT INTO
                sistema.acao (
                    dt_criacao,
                    ds_label,
                    ds_module,
                    ds_controller,
                    ds_action,
                    id_parent,
                    ds_descricao,
                    fl_tipo,
                    id
                )
            VALUES
                (
                    now(),
                    'Deletar',
                    'sinistro2',
                    'vistoriadordespesa',
                    'delete',
                    (SELECT id FROM sistema.acao WHERE ds_module = 'sinistro2' AND ds_descricao = 'Anexar Comprovantes de Despesas' AND ds_action = 'form'),
                    'Ação para remover registro de Comprovantes de Despesa',
                    'L',
                    nextval('sistema.acao_id_seq'::regclass)
                );

            UPDATE sistema.acao SET ds_label = 'Gerar Cobrança', ds_descricao = 'Gerar Cobrança' WHERE ds_controller = 'cobrancaessor' AND ds_label = 'Gerar Relatórios';

            
            INSERT INTO sistema.roles_acao (id_role, id_acao) VALUES(18, (SELECT id_parent FROM sistema.acao WHERE ds_label = 'Gerar Cobrança'));
            
SQL
        );
    }

    public function down(): void
    {
        $this->execute(<<<SQL
            DELETE FROM sistema.usuarios_acao WHERE id_acao IN (SELECT id FROM sistema.acao WHERE ds_controller = 'vistoriadordespesa' AND ds_module = 'sinistro2');
            DELETE FROM sistema.roles_acao WHERE id_acao IN (SELECT id FROM sistema.acao WHERE ds_controller = 'parametrotipodespesa' AND ds_module = 'sinistro2');
            DELETE FROM sistema.roles_acao WHERE id_acao IN (SELECT id FROM sistema.acao WHERE ds_controller = 'vistoriadordespesa' AND ds_module = 'sinistro2');
            DELETE FROM sistema.acao WHERE ds_controller = 'parametrotipodespesa' AND ds_module = 'sinistro2';
            DELETE FROM sistema.acao WHERE ds_controller = 'vistoriadordespesa' AND ds_module = 'sinistro2';
            DROP TABLE sinistro.vistoriador_despesa_arquivo;
            DROP TABLE sinistro.vistoriador_despesa;
            DROP TABLE sinistro.parametro_tipo_despesa_estado;
            DROP TABLE sinistro.parametro_tipo_despesa;
            DROP TABLE sinistro.tipo_despesa;

            UPDATE sistema.acao SET ds_label = 'Gerar Relatórios', ds_descricao = 'Gerar Relatórios' WHERE ds_controller = 'cobrancaessor' AND ds_label = 'Gerar Cobrança';
SQL
        );
    }
}
