import sys
sys.path.insert(0, r'D:\__sistem__\Masaustu\FikoYT.Yeni.Cag\_yama_tmp')
from yama_lib import *

P = r'D:\__sistem__\Masaustu\FikoYT.Yeni.Cag\fikatia-local\uygulama\fikocad\lisans_uzaktan_komut.cpp'
yedekle(P)
t, crlf = oku(P)

t = degistir(t, '#include <cstring>\n#include <ctime>\n', '#include <cstdio>\n#include <cstring>\n#include <ctime>\n')

# jsonAl: Go encoding/json < > & ve U+2028/2029'u \uXXXX diye kacirir (socket.io-go-parser
# encoder.go:82, json.Marshal varsayilani). Eski jsonAl "\u0026"yi "u0026" yapiyor, kanonik
# metin imzalananla FARKLI cikiyor ve imza gecerli komutta bile RED veriyordu.
R1 = r'''// \uXXXX icindeki 4 hex hanesini oku. false = bozuk.
bool hex4Oku(const std::string& j, std::size_t i, unsigned& v) {
  if (i + 4 > j.size()) return false;
  v = 0;
  for (std::size_t k = 0; k < 4; ++k) {
    const char c = j[i + k];
    unsigned d = 0;
    if (c >= '0' && c <= '9') d = (unsigned)(c - '0');
    else if (c >= 'a' && c <= 'f') d = 10u + (unsigned)(c - 'a');
    else if (c >= 'A' && c <= 'F') d = 10u + (unsigned)(c - 'A');
    else return false;
    v = (v << 4) | d;
  }
  return true;
}

void utf8Ekle(std::string& r, unsigned cp) {
  if (cp < 0x80) {
    r += (char)cp;
  } else if (cp < 0x800) {
    r += (char)(0xC0 | (cp >> 6));
    r += (char)(0x80 | (cp & 0x3F));
  } else if (cp < 0x10000) {
    r += (char)(0xE0 | (cp >> 12));
    r += (char)(0x80 | ((cp >> 6) & 0x3F));
    r += (char)(0x80 | (cp & 0x3F));
  } else {
    r += (char)(0xF0 | (cp >> 18));
    r += (char)(0x80 | ((cp >> 12) & 0x3F));
    r += (char)(0x80 | ((cp >> 6) & 0x3F));
    r += (char)(0x80 | (cp & 0x3F));
  }
}

std::string jsonAl(const std::string& j, const char* anahtar) {
  const std::string pat = std::string("\"") + anahtar + "\"";
  size_t i = j.find(pat);
  if (i == std::string::npos) return "";
  i += pat.size();
  while (i < j.size() && (j[i] == ' ' || j[i] == ':')) ++i;
  if (i >= j.size() || j[i] != '"') return "";
  ++i;
  std::string r;
  while (i < j.size() && j[i] != '"') {
    if (j[i] == '\\' && i + 1 < j.size()) {
      ++i;
      switch (j[i]) {
        case 'n': r += '\n'; break;
        case 't': r += '\t'; break;
        case 'r': r += '\r'; break;
        case 'b': r += '\b'; break;
        case 'f': r += '\f'; break;
        case 'u': {
          unsigned cp = 0;
          if (hex4Oku(j, i + 1, cp)) {
            i += 4;  // son hex hanesinde dur
            if (cp >= 0xD800 && cp <= 0xDBFF && i + 6 < j.size() && j[i + 1] == '\\' &&
                j[i + 2] == 'u') {
              unsigned lo = 0;
              if (hex4Oku(j, i + 3, lo) && lo >= 0xDC00 && lo <= 0xDFFF) {
                cp = 0x10000u + ((cp - 0xD800u) << 10) + (lo - 0xDC00u);
                i += 6;
              }
            }
            utf8Ekle(r, cp);
          } else {
            r += 'u';
          }
          break;
        }
        default:  r += j[i];   break;  // \" \\ \/
      }
    } else {
      r += j[i];
    }
    ++i;
  }
  return r;
}

// Cevap JSON'una gomulecek metni kacir (komutId imza dogrulanmadan once de cevaba girer).
std::string jsonKac(const std::string& s) {
  std::string r;
  for (const unsigned char c : s) {
    switch (c) {
      case '"':  r += "\\\""; break;
      case '\\': r += "\\\\"; break;
      case '\n': r += "\\n";  break;
      case '\r': r += "\\r";  break;
      case '\t': r += "\\t";  break;
      default:
        if (c < 0x20) {
          char b[8];
          std::snprintf(b, sizeof b, "\\u%04x", (unsigned)c);
          r += b;
        } else {
          r += (char)c;
        }
    }
  }
  return r;
}

'''
t = aralik_degistir(t, 'std::string jsonAl(const std::string& j, const char* anahtar) {', 'std::string simdiZaman() {', R1)

t = degistir(t,
'''  cevapJson = std::string("{\\"basarili\\":") + (ok ? "true" : "false") +
              ",\\"mesaj\\":\\"" + sonuc + "\\",\\"komutId\\":\\"" + komutId + "\\"}";''',
'''  cevapJson = std::string("{\\"basarili\\":") + (ok ? "true" : "false") +
              ",\\"mesaj\\":\\"" + jsonKac(sonuc) + "\\",\\"komutId\\":\\"" + jsonKac(komutId) +
              "\\"}";''')

yaz(P, t, crlf)
print('komut.cpp TAMAM crlf=%s' % crlf)
