#!/bin/bash

# Verifica se o arquivo CSV e o prefixo do arquivo SQL foram fornecidos como argumentos
if [ "$#" -ne 2 ]; then
  echo "Uso: $0 <input.csv> <output_prefix>"
  exit 1
fi

input_csv=$1
output_prefix=$2

# Verifica se o arquivo CSV existe
if [ ! -f "$input_csv" ]; then
  echo "Arquivo CSV não encontrado!"
  exit 1
fi

# Corrige caracteres específicos
corrected_csv="${input_csv%.csv}_corrigido.csv"
sed -e 's/ﾁ/Á/g' \
    -e 's/Ã©/é/g' \
    -e 's/Ã­/í/g' \
    -e 's/Ã¡/á/g' \
    -e 's/Ã³/ó/g' \
    -e 's/Ãº/ú/g' \
    -e 's/Ã£/ã/g' \
    -e 's/Ã§/ç/g' \
    -e 's/Ã¨/è/g' \
    -e 's/Ã‡/Ç/g' \
    "$input_csv" > "$corrected_csv"

echo "Arquivo corrigido salvo como $corrected_csv"

# Inicializa variáveis
batch_size=50
batch_number=1
line_count=0
output_sql="${output_prefix}_${batch_number}.sql"

# Inicializa o arquivo SQL com o cabeçalho
create_sql_header() {
  echo "USE clicklifeesqlprd;" > "$output_sql"
  echo "" >> "$output_sql"
  echo "SET IDENTITY_INSERT dbo.Colaboradores ON;" >> "$output_sql"
  echo "" >> "$output_sql"
  echo "BEGIN TRANSACTION;" >> "$output_sql"
}

# Adiciona o rodapé ao arquivo SQL
create_sql_footer() {
  echo "" >> "$output_sql"
  echo "COMMIT;" >> "$output_sql"
  echo "" >> "$output_sql"
  echo "SET IDENTITY_INSERT dbo.Colaboradores OFF;" >> "$output_sql"
}

# Função para obter o EmpresaId a partir do CNPJ, considerando a situação da empresa
get_empresa_id() {
  local cnpj=$1
  local empresa_id

  # Consulta o EmpresaId, somente se a empresa estiver ativa
  empresa_id=$(sqlcmd -S clicklifeesqlsrvprd.database.windows.net -d clicklifeesqlprd -U adminclicklifee -P 9iVgJeJ4djLj_aAzP3lxiakoGP2p8_j8XWzR -Q "SET NOCOUNT ON; SELECT Id FROM dbo.Empresas WHERE Cnpj = '$cnpj' AND SituacaoEmpresa = 'Ativo'" -h -1 | xargs)

  echo "$empresa_id"
}

process_line() {
  local nome=$(echo "$1" | sed "s/'/''/g")
  local cpf=$(echo "$2" | sed 's/[^0-9]//g')
  local cnpj=$(echo "$3" | sed 's/[^0-9]//g')

  # Pega somente a parte do nome antes do hífen
  nome=$(echo "$nome" | cut -d'-' -f1)

  # Verifica se o CPF tem menos de 11 dígitos e preenche com zeros à esquerda
  if [ ${#cpf} -lt 11 ]; then
    cpf=$(printf "%011d" "$cpf")
  fi

  # Verifica se o CNPJ tem menos de 14 dígitos e preenche com zeros à esquerda
  if [ ${#cnpj} -lt 14 ]; then
    cnpj=$(printf "%014d" "$cnpj")
  fi

  # Obtém o EmpresaId da tabela Empresas
  local empresa_id
  empresa_id=$(get_empresa_id "$cnpj")

  # Verifica se o EmpresaId foi encontrado
  if [ -z "$empresa_id" ]; then
    echo "Empresa com CNPJ $cnpj não encontrada ou não está ativa. Linha ignorada." >&2
    return
  fi

  # Adiciona uma linha de inserção ou atualização ao arquivo SQL
  echo "IF EXISTS (SELECT 1 FROM dbo.Colaboradores WHERE Cpf = '$cpf')" >> "$output_sql"
  echo "BEGIN" >> "$output_sql"
  echo "  UPDATE dbo.Colaboradores" >> "$output_sql"
  echo "  SET Nome = '$nome', SituacaoColaborador = 'Ativo', EmpresaId = $empresa_id" >> "$output_sql"
  echo "  WHERE Cpf = '$cpf';" >> "$output_sql"
  echo "END" >> "$output_sql"
  echo "ELSE" >> "$output_sql"
  echo "BEGIN" >> "$output_sql"
  echo "  INSERT INTO dbo.Colaboradores (Id, Cpf, Nome, SituacaoColaborador, EmpresaId, DataCriacao)" >> "$output_sql"
  echo "  VALUES (@nextId, '$cpf', '$nome', 'Ativo', $empresa_id, '2024-08-20 15:00:00');" >> "$output_sql"
  echo "END" >> "$output_sql"
  echo "" >> "$output_sql"
}

# Inicializa o primeiro arquivo SQL
create_sql_header

# Lê o arquivo CSV corrigido linha por linha e divide em lotes
while IFS=';' read -r nome cpf cnpj; do
  # Ignora linhas vazias
  if [ -z "$nome" ] || [ -z "$cpf" ] || [ -z "$cnpj" ]; then
    continue
  fi

  process_line "$nome" "$cpf" "$cnpj"

  line_count=$((line_count + 1))

  if [ $line_count -ge $batch_size ]; then
    create_sql_footer
    echo "Arquivo SQL gerado: $output_sql"

    # Prepara o próximo arquivo SQL
    batch_number=$((batch_number + 1))
    output_sql="${output_prefix}_${batch_number}.sql"
    line_count=0

    # Inicializa o próximo arquivo SQL com o cabeçalho
    create_sql_header
  fi
done < "$corrected_csv"

# Processa o último lote, se houver
if [ $line_count -gt 0 ]; then
  create_sql_footer
  echo "Arquivo SQL gerado: $output_sql"
fi
