<?php

// Verifica se o script foi executado com os parâmetros necessários
if ($argc !== 3) {
    // Exibe uma mensagem de erro e encerra o script
    fwrite(STDERR, "Uso: php {$argv[0]} <arquivo_entrada.csv> <arquivo_saida.sql>\n");
    exit(1); // Código de saída 1 indica erro
}

// Captura os parâmetros
$inputFile = $argv[1];
$outputFile = $argv[2];

// Verifica se o arquivo de entrada existe
if (!file_exists($inputFile)) {
    fwrite(STDERR, "Erro: O arquivo de entrada '{$inputFile}' não existe.\n");
    exit(1);
}

// Exibe mensagem de sucesso (opcional)
fwrite(STDOUT, "Processando: Arquivo de entrada '{$inputFile}' e saída '{$outputFile}'.\n");

function readMetadataAndWriteInsert($inputFile, $outputFile) {
    global $rodada;
    global $entidade;
    $handle = fopen($inputFile, "r");
    $output = fopen($outputFile, "w");

    if ($handle === false || $output === false) {
        throw new Exception("Erro ao abrir o arquivo.");
    }

    while (($line = fgets($handle)) !== false) {
        $line = trim($line);

        // Ignorar linhas vazias
        if (empty($line)) {
            continue;
        }

        // Processar metadados
        if (strpos($line, '#metadados') === 0) {
            $parts = explode(':', substr($line, 11), 2); // Remove '#metadados ' e divide chave e valor
            $key = trim($parts[0]);
            $value = isset($parts[1]) ? trim($parts[1]) : null;

            // Armazena os metadados em variáveis específicas
            if ($key === "nome_entidade_completo") {
                $nome_entidade_completo = $value;
            } elseif ($key === "sigla_entidade") {
                $sigla_entidade = $value;
            } elseif ($key === "entidade") {
                $entidade = $value;
            } elseif ($key === "rodada") {
                $rodada = $value;
            } elseif ($key === "tipo_instituicao") {
                $tipo_instituicao = $value;
            }
        } elseif (!empty($line) && $line[0] !== '#') {
            // Parar de ler se atingir a primeira linha válida de dados
            break;
        }
    }

    // Escreve o comando SQL no arquivo de saída
    $insert_instituicao = "
INSERT IGNORE INTO instituicoes (nome_instituicao, sigla, identificador, id_tipo_instituicao) 
VALUES (\"$nome_entidade_completo\", \"$sigla_entidade\", \"$entidade\", 
        (SELECT id_chave_tipo_instituicao FROM tipos_instituicoes WHERE nome_tipo_instituicao = \"$tipo_instituicao\"));\n\n";
    
    fwrite($output, $insert_instituicao);

    // Retorna a posição do ponteiro no arquivo de entrada
    $lastValidPosition = ftell($handle) - strlen($line) - 1;
    fclose($handle);
    fclose($output);
    return $lastValidPosition; 

}

// Função para normalizar caracteres acentuados
function normalizeToken($token) {
    $token = mb_strtolower($token, "UTF-8");
    $token = str_replace(['á', 'à', 'ã', 'â', 'ä'], "a", $token);
    $token = str_replace(['é', 'è', 'ê', 'ë'], "e", $token);
    $token = str_replace(['í', 'ì', 'î', 'ï'], "i", $token);
    $token = str_replace(['ó', 'ò', 'ô', 'õ', 'ö'], "o", $token);
    $token = str_replace(['ú', 'ù', 'û', 'ü'], "u", $token);
    $token = str_replace(['ç'], "c", $token);
    return $token;
}

echo "\nCriando inserts para dados do Senac\n";
// Define o arquivo de entrada e saída
//$inputFile = "cursos_senac_1.csv";
//$outputFile = "saida_cursos_senac_1.sql";
$dataStartPosition = readMetadataAndWriteInsert($inputFile, $outputFile);

$tipo_elemento_sintatico = "locucao substantiva";

$conta=0;
$classificacoes=[];
// Lê o arquivo CSV


if (($handle = fopen($inputFile, "r")) !== false) {
    fseek($handle, $dataStartPosition); // Posiciona o ponteiro na linha dos dados
    $output = fopen($outputFile, "a");

    // Processa a primeira linha (cabeçalho) para criar tipos_classificacoes
    if (($header = fgetcsv($handle, 0, "|")) !== false) {
        foreach ($header as $field) {
            $normalizedField = normalizeToken($field);
	    $classificacoes[]=$field;
            fwrite($output, "INSERT IGNORE INTO tipos_classificacoes (nome_tipo_classificacao) VALUES (\"$field\");\n ");
        }
    }

    // Processa as linhas seguintes para criar tipos_cursos e tokens
    $tokens = [];
    $saida="";
    $campos = "";
    $inserts_frases_array=[];
    $insert_titulos_array=[];
    $insert_tipos_cursos_array=[];
    $conta_cursos=0;
    while (($row = fgetcsv($handle, 0, "|")) !== false) {
    $conta_cursos++;	    
    $coluna=0;	
        foreach ($row as $column) {
            if ($column == null || $column == "") { $column = "nulo"; }
                $column = mb_strtolower($column, "UTF-8");
                $column = preg_replace('/,/', '', $column); // Remove vírgulas

		preg_match_all('/[^\s]+/', $column, $matches);
	    	$conta++;
		unset($frase);
		$frase=[];
                foreach ($matches[0] as $token) {
		    
                    $normalizedToken = normalizeToken($token);
                    $tokens[$token] = $normalizedToken;
		    $frase[] = $token;

                }
		$insert_frases="";
		$ordem = 0;


		$insert_titulos_array[implode("_",$frase)] = $classificacoes[$coluna];
		if ($classificacoes[$coluna] == "Tipo de Curso") {
			$insert_tipos_cursos_array[implode("_",$frase)] = implode("_",$frase);
			$saida .= "INSERT INTO cursos (nome_curso, id_tipo_curso, id_instituicao) VALUES (\"".$entidade."_".$rodada."_".$conta_cursos."\", (select id_chave_tipo_curso from tipos_cursos where nome_tipo_curso = \"".implode("_",$frase)."\"), (SELECT id_chave_instituicao FROM instituicoes WHERE identificador = \"".$entidade."\"));\n";
		}
		$campos .= "INSERT INTO campos_cursos (nome_campo_curso, id_curso, id_titulo, id_tipo_classificacao) VALUES (\"".$entidade."_".$rodada."_".$conta_cursos."_".$classificacoes[$coluna]."\", (select id_chave_curso from cursos where nome_curso = \"".$entidade."_".$rodada."_".$conta_cursos."\"), (select id_chave_titulo from titulos where nome_titulo = \"".implode("_",$frase)."\"),(SELECT id_chave_tipo_classificacao FROM tipos_classificacoes WHERE nome_tipo_classificacao = \"".$classificacoes[$coluna]."\"));\n";
		//echo "conta: ".$conta.") ";
		foreach ($frase as $token) {
		        $ordem++;
			$insert_frases_array[implode("_",$frase)."_".$ordem][0] = $token;
			$insert_frases_array[implode("_",$frase)."_".$ordem][1] = $ordem;
			$insert_frases_array[implode("_",$frase)."_".$ordem][2] = implode("_",$frase);
			//echo $token." ";
			//var_dump($insert_frases_array);
		}
		//echo "\n";
	    $coluna++;
        }
    }
    		foreach ($insert_tipos_cursos_array as $tipo_curso => $tipo_curso_array) {
			$saida = "INSERT IGNORE INTO tipos_cursos (nome_tipo_curso) VALUES (\"".$tipo_curso_array."\");\n".$saida;
		}
		foreach ($insert_titulos_array as $titulo => $titulo_array) {
			$saida .= "INSERT IGNORE INTO titulos (nome_titulo, id_tipo_elemento_sintatico) VALUES (\"".$titulo."\", (SELECT id_chave_tipo_elemento_sintatico FROM tipos_elementos_sintaticos WHERE nome_tipo_elemento_sintatico = \"".$tipo_elemento_sintatico."\"));\n ";
		}
		$saida .= "\n";
		foreach ($insert_frases_array as $frase => $frase_array) {
			$saida .= "INSERT IGNORE INTO frases (nome_frase, id_token, id_titulo, ordem) VALUES (\"".$frase."\",(SELECT id_chave_token FROM tokens WHERE BINARY  acentuada= \"$frase_array[0]\"), (select id_chave_titulo from titulos where nome_titulo=\"".$frase_array[2]."\"), \"".$frase_array[1]."\");\n ";
		}

    // Grava os tokens no arquivo de saída
    foreach ($tokens as $original => $normalized) {
		    if (ctype_digit($normalized) == true) {
			$insere_classificacao = "INSERT IGNORE INTO classificacoes_tokens (nome_token, id_tipo_token) VALUES (\"".$normalized."\", (SELECT id_chave_tipo_token FROM tipos_tokens WHERE nome_tipo_token = \"numeral\"));\n";
		    }
	            $saida = $insere_classificao."INSERT IGNORE INTO tokens (nome_token, acentuada, id_tipo_token) VALUES (\"$normalized\", \"$original\", (SELECT id_tipo_token FROM classificacoes_tokens WHERE nome_token = \"".$normalized."\"));\n  " . $saida;
    } 
		$saida .= $campos;
    fwrite($output, $saida); 
    fclose($handle);
    fclose($output);
    echo "Arquivo $outputFile criado com sucesso com $conta_cursos cursos.\n";
} else {
    echo "Erro ao abrir o arquivo $inputFile.";
}

?>
