<?php
date_default_timezone_set('America/Sao_Paulo');
$log_file = __DIR__ . '/importacao_oci.log';

function logMsg($mensagem) {
    global $log_file;
    $hora = date('Y-m-d H:i:s');
    file_put_contents($log_file, "[$hora] $mensagem\n", FILE_APPEND);
}
////////////////////////////////////////////////////////// CONEXÃO POSTGRESQL /////////////////////////////////////////////

/*$ip_postgres = '189.84.71.200';
$porta_postgres = '1000';
$usuario_postgres = 'postgres'; 
$senha_postgres = '#AA8T1t~V7XeSj0R@4F_meGrB-tKZU'; 
$banco_postgres = 'esus'; */ 

$ip_postgres = '177.70.19.203';
$porta_postgres = '5433';
$usuario_postgres = 'postgres'; 
$senha_postgres = '?-f]Ak6E-cN0qXm9YAatM}r_ku'; 
$banco_postgres = 'esus';
////////////////////////////////////////////////////////// CONEXÃO MYSQL /////////////////////////////////////////////


$host_mysql = 'localhost';
$banco_mysql = 'portalgsaude_gsaude_lfreitas';
$usuario_mysql = 'portalgsaude_gestor';
$senha_mysql = 'CGm57KsElcsmagalhaes';
$charset_mysql = 'utf8mb4';


//////////////////////////////////////////////////////// PROCESSAMENTO /////////////////////////////////////////////
$tabela_destino = 'tb_hist_esus_oci';
$tabela_temp = 'tb_hist_esus_oci_tmp';
$tamanho_chunk = 800;

try {
    
    $dsn_pg = "pgsql:host=$ip_postgres;port=$porta_postgres;dbname=$banco_postgres;";
    $pdo_pgsql = new PDO($dsn_pg, $usuario_postgres, $senha_postgres, [
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
    ]);
    
    logMsg("Conectado ao PostgreSQL");

   
    $dsn_mysql = "mysql:host=$host_mysql;dbname=$banco_mysql;charset=$charset_mysql";
    $pdo_mysql = new PDO($dsn_mysql, $usuario_mysql, $senha_mysql, [
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
    ]);
    logMsg("Conectado ao MySQL");


    $query_pg = "SELECT
    t1.co_seq_atend_prof as id_atend_esus,
    t7.nu_cpf as nu_cpf,
    t7.nu_cns as nu_cns,
    t7.no_cidadao,
    TO_CHAR(t7.dt_nascimento, 'YYYY-MM-DD') as dt_nascimento,
    t7.no_mae,
    CASE UPPER(t7.no_sexo)
    WHEN 'MASCULINO' THEN 'M'
    WHEN 'FEMININO' THEN 'F'
    ELSE NULL
    END AS no_sexo,
    COALESCE(NULLIF(LEFT(t19.co_ibge,6), ''), '291920') AS co_ibge,
    t7.ds_cep,
    t7.ds_logradouro,
    t7.no_bairro,
    t7.nu_numero as numero_endereco,
    t7.nu_telefone_celular,
    TO_CHAR(t1.dt_inicio, 'YYYY-MM-DD') AS data_atendimento,
    TO_CHAR(t14.dt_requisicao, 'YYYY-MM-DD') AS data_requisicao,
    SUBSTRING(t14.ds_justificativa_procedimento FROM 1 FOR 255) AS ds_justificativa_procedimento,
    t16.no_proced as procedimento,
    t16.co_proced as codigo_sigtap,
    COALESCE(t17.nu_cid10, 'R69') AS co_cid_justificativa_procedimento,
    t13.nu_cpf as cpf_prof,
    t13.nu_cns as cns_prof,
    t11.nu_cnes as nu_cnes,
    t20.nu_ine as ine_equipe,
    t20.no_equipe as nome_equipe
  FROM public.tb_atend_prof t1
  LEFT JOIN public.tb_atend t2 ON t2.co_atend_prof = t1.co_seq_atend_prof
  LEFT JOIN public.tb_prontuario t6 ON t2.co_prontuario = t6.co_seq_prontuario
  LEFT JOIN public.tb_cidadao t7 ON t6.co_cidadao = t7.co_seq_cidadao
  LEFT JOIN public.tb_lotacao t9 ON t1.co_lotacao = t9.co_ator_papel
  LEFT JOIN public.tb_unidade_saude t11 ON t9.co_unidade_saude = t11.co_seq_unidade_saude
  LEFT JOIN public.tb_prof t13 ON t9.co_prof = t13.co_seq_prof
  LEFT JOIN public.tb_requisicao_exame t14 ON t1.co_seq_atend_prof = t14.co_atend_prof
  LEFT JOIN public.tb_exame_requisitado t15 ON t14.co_seq_requisicao_exame = t15.co_requisicao_exame
  LEFT JOIN public.tb_proced t16 ON t15.co_proced = t16.co_seq_proced
  LEFT JOIN public.tb_cid10 t17 ON t14.co_cid10 = t17.co_cid10
  LEFT JOIN public.tb_proced_grupo t18 ON t16.co_proced_grupo = t18.co_proced_grupo
  LEFT JOIN public.tb_localidade t19 ON t7.co_localidade_endereco = t19.co_localidade
  LEFT JOIN public.tb_equipe t20 ON t20.co_seq_equipe = t9.co_equipe
  
  WHERE t7.no_cidadao IS NOT NULL
  AND t18.nu_ms = '09'
  ORDER BY t14.dt_requisicao DESC";

    logMsg("Executando query no PostgreSQL...");
    $stmt_pg = $pdo_pgsql->query($query_pg);
    $registros = $stmt_pg->fetchAll(PDO::FETCH_ASSOC);
    logMsg("Query retornou " . count($registros) . " registros.");

    if (empty($registros)) {
        logMsg("Nenhum registro retornado.");

        exit;
    }

   
    $colunas = array_keys($registros[0]);
    $colunas_create = implode(', ', array_map(fn($c) => "`$c` TEXT", $colunas));
    $pdo_mysql->exec("CREATE TABLE IF NOT EXISTS `$tabela_temp` ($colunas_create)");

    } catch (Exception $e) {
    logMsg("Erro ao conectar ou buscar dados: " . $e->getMessage());
    return;
    }

    $pdo_mysql->beginTransaction();
    try {
        for ($i = 0; $i < count($registros); $i += $tamanho_chunk) {
            $chunk = array_slice($registros, $i, $tamanho_chunk);
            $placeholders = '(' . implode(',', array_fill(0, count($colunas), '?')) . ')';
            $values_sql = implode(',', array_fill(0, count($chunk), $placeholders));
            $sql = "INSERT INTO `$tabela_temp` (`" . implode('`,`', $colunas) . "`) VALUES $values_sql";
            $valores = [];
            foreach ($chunk as $linha) {
                foreach ($colunas as $col) {
                    $valores[] = $linha[$col];
                }
            }
            $stmt_insert = $pdo_mysql->prepare($sql);
            $stmt_insert->execute($valores);
        }

       
        $pdo_mysql->commit();
        logMsg("Inserção concluída com sucesso.");
        $pdo_mysql->exec("DROP TABLE IF EXISTS `$tabela_destino`");
        $pdo_mysql->exec("RENAME TABLE `$tabela_temp` TO `$tabela_destino`");

       logMsg("Importação Finalizada.");
       logMsg("/////////////////////////////////////////////////////////////////////////////////");

    } catch (Exception $e) {
    $pdo_mysql->rollBack();
    logMsg("Erro durante inserção: " . $e->getMessage());
}