-- ===============================================================================================================
-- Status Funcionário
-- ===============================================================================================================
CREATE TABLE IF NOT EXISTS public.funcionario_status (
    id BIGINT PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,
    descricao VARCHAR(255) NOT NULL,
    observacao TEXT DEFAULT NULL
);

INSERT INTO public.funcionario_status (id, descricao, observacao) VALUES
(1, 'Ativo', 'Funcionário ativo'),
(2, 'Inativo', 'Funcionário inativo recebendo benefício do INSS'),
(3, 'Inativo', 'Funcionário aposentado'),
(4, 'Inativo', 'Funcionário desligado da empresa');

SELECT setval(pg_get_serial_sequence('public.funcionario_status','id'), (SELECT MAX(id) FROM public.funcionario_status));

-- ===============================================================================================================
-- Estado Civil Funcionário
-- ===============================================================================================================

CREATE TABLE IF NOT EXISTS public.funcionario_estado_civil (
    id BIGINT PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,
    descricao VARCHAR(255) NOT NULL
);

INSERT INTO public.funcionario_estado_civil (id, descricao) VALUES
(1, 'Solteiro(a)'),
(2, 'Casado(a)'),
(3, 'Divorciado(a)'),
(4, 'Separado(a)'),
(5, 'Viúvo(a)');

SELECT setval(pg_get_serial_sequence('public.funcionario_estado_civil','id'), (SELECT MAX(id) FROM public.funcionario_estado_civil));

-- ===============================================================================================================
-- Nível de Instrução Funcionário
-- ===============================================================================================================
CREATE TABLE IF NOT EXISTS public.funcionario_nivel_instrucao (
    id BIGINT PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,
    codigo_xml VARCHAR(50) NOT NULL,
    descricao VARCHAR(255) NOT NULL
);

INSERT INTO public.funcionario_nivel_instrucao (id, codigo_xml, descricao) VALUES
(1, '01', 'Analfabeto, inclusive o que, embora tenha recebido instrução, não se alfabetizou'),
(2, '02', 'Até o 5º ano incompleto do ensino fundamental (antiga 4ª série) ou que se tenha alfabetizado sem ter frequentado escola regular'),
(3, '03', '5º ano completo do ensino fundamental'),
(4, '04', 'Do 6º ao 9º ano do ensino fundamental incompleto (antiga 5ª a 8ª série)'),
(5, '05', 'Ensino fundamental completo'),
(6, '06', 'Ensino médio incompleto'),
(7, '07', 'Ensino médio completo'),
(8, '08', 'Educação superior incompleta'),
(9, '09', 'Educação superior completa'),
(10, '10', 'Pós-graduação completa'),
(11, '11', 'Mestrado completo'),
(12, '12', 'Doutorado completo');

SELECT setval(pg_get_serial_sequence('public.funcionario_nivel_instrucao','id'), (SELECT MAX(id) FROM public.funcionario_nivel_instrucao));

-- ===============================================================================================================
-- Raça/Cor Funcionário
-- ===============================================================================================================
CREATE TABLE IF NOT EXISTS public.funcionario_raca_cor (
    id BIGINT PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,
    codigo_xml VARCHAR(50) NOT NULL,
    descricao VARCHAR(255) NOT NULL
);

INSERT INTO public.funcionario_raca_cor (id, codigo_xml, descricao) VALUES
(1, '1', 'Branca'),
(2, '2', 'Preta'),
(3, '3', 'Parda'),
(4, '4', 'Amarela'),
(5, '5', 'Indígena'),
(6, '6', 'Não informado');

SELECT setval(pg_get_serial_sequence('public.funcionario_raca_cor','id'), (SELECT MAX(id) FROM public.funcionario_raca_cor));

-- ===============================================================================================================
-- Funcionário
-- ===============================================================================================================
CREATE TABLE IF NOT EXISTS public.funcionario (
    -- Identificadores
    id BIGINT PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,
    uuid UUID NOT NULL UNIQUE,
    empresa_id BIGINT NOT NULL REFERENCES public.empresa(id) ON UPDATE CASCADE ON DELETE RESTRICT,

    -- Dados Funcionário
    status_id BIGINT NOT NULL REFERENCES public.funcionario_status(id) ON UPDATE CASCADE ON DELETE RESTRICT,
    nome VARCHAR(255) NOT NULL,
    have_nome_social SMALLINT NOT NULL DEFAULT 0,
    nome_social VARCHAR(255) DEFAULT NULL,

    -- Documentos
    document_cpf VARCHAR(11) NOT NULL,
    document_pis VARCHAR(11) DEFAULT NULL,

    -- Nível de Instrução
    nivel_instrucao_id BIGINT DEFAULT NULL REFERENCES public.funcionario_nivel_instrucao(id) ON UPDATE CASCADE ON DELETE RESTRICT,

    -- Estado Civil
    estado_civil_id BIGINT NOT NULL DEFAULT 1 REFERENCES public.funcionario_estado_civil(id) ON UPDATE CASCADE ON DELETE RESTRICT,

    -- Raça/Cor
    raca_cor_id BIGINT DEFAULT NULL REFERENCES public.funcionario_raca_cor(id) ON UPDATE CASCADE ON DELETE RESTRICT,
    
    -- Data de Nascimento e Óbito
    data_nascimento DATE NOT NULL,
    data_obito DATE DEFAULT NULL,
    
    -- Sexo
    sexo CHAR(1) DEFAULT NULL,

    -- Filiação
    filiacao_1 VARCHAR(255) DEFAULT NULL,
    filiacao_2 VARCHAR(255) DEFAULT NULL,

    -- Naturalidade
    naturalidade_pais BIGINT DEFAULT 115 REFERENCES esocial.tab_06(id) ON UPDATE CASCADE ON DELETE RESTRICT,
    naturalidade_uf CHAR(2) DEFAULT NULL REFERENCES esocial.tab_07(id) ON UPDATE CASCADE ON DELETE RESTRICT,
    naturalidade_municipio VARCHAR(255) DEFAULT NULL,
    naturalidade_municipio_codigo_ibge VARCHAR(7) DEFAULT NULL,

    -- Residência
    endereco_tipo_logradouro BIGINT DEFAULT NULL REFERENCES esocial.tab_20(id) ON UPDATE CASCADE ON DELETE RESTRICT,
    endereco_descricao_logradouro VARCHAR(100) DEFAULT NULL,
    endereco_numero_logradouro VARCHAR(10) DEFAULT NULL,
    endereco_complemento_logradouro VARCHAR(30) DEFAULT NULL,
    endereco_bairro VARCHAR(90) DEFAULT NULL,
    endereco_cep VARCHAR(8) DEFAULT NULL,
    endereco_codigo_municipio_ibge VARCHAR(7) DEFAULT NULL,
    endereco_uf CHAR(2) DEFAULT NULL,

    -- Endereço no Exterior
    endereco_exterior_pais_id BIGINT DEFAULT NULL REFERENCES esocial.tab_06(id) ON UPDATE CASCADE ON DELETE RESTRICT,
    endereco_exterior_descricao_logradouro VARCHAR(100) DEFAULT NULL,
    endereco_exterior_numero_logradouro VARCHAR(10) DEFAULT NULL,
    endereco_exterior_complemento_logradouro VARCHAR(30) DEFAULT NULL,
    endereco_exterior_bairro VARCHAR(90) DEFAULT NULL,
    endereco_exterior_nome_cidade VARCHAR(50) DEFAULT NULL,
    endereco_exterior_cep VARCHAR(12) DEFAULT NULL,

    -- Contato
    email VARCHAR(255) DEFAULT NULL,
    telefone VARCHAR(20) DEFAULT NULL,
    celular VARCHAR(20) DEFAULT NULL,

    -- Controle de Registros
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT NULL,
    deleted_at TIMESTAMP DEFAULT NULL
);