# -*- coding: utf-8 -*-
"""
make-lang-pages.py — пече по един файл за език от входната страница.

ЗАЩО СЪЩЕСТВУВА
Входната страница сменя езика с JavaScript, но си остава на един адрес.
Google индексира адреси, не езици — затова за него съществува само
българската версия. Тук се правят отделни файлове с вграден текст,
всеки на свой адрес, плюс hreflang, който казва на Google кой за кой е.

КАК СЕ ПОЛЗВА
    python3 make-lang-pages.py

Чете fatedways-landing.html от същата папка и произвежда:
    fatedways-en.html, fatedways-ru.html, fatedways-de.html,
    fatedways-fr.html, fatedways-es.html, fatedways-it.html,
    fatedways-pt.html
и допълва самата fatedways-landing.html с блока hreflang.

ВАЖНО
Файловете стоят в КОРЕНА, не в подпапки — така относителните адреси
(gate2, скриптовете) остават верни и .htaccess не се пипа. Съществуващото
правило за чисти адреси вече ги обслужва на /en, /ru и така нататък.

Пуска се наново при всяка промяна на текста във входната страница.
"""

import io, re, json, subprocess, sys, os

SRC   = 'fatedways-landing.html'
BASE  = 'https://fatedways.com/'
LANGS = ['bg', 'en', 'ru', 'de', 'fr', 'es', 'it', 'pt']
OUT   = ['en', 'ru', 'de', 'fr', 'es', 'it', 'pt']     # българският си остава на /

# Пълните названия за og:locale — Facebook и Viber ги искат в този вид.
LOCALE = {'bg':'bg_BG','en':'en_US','ru':'ru_RU','de':'de_DE',
          'fr':'fr_FR','es':'es_ES','it':'it_IT','pt':'pt_PT'}


def read(p):
    return io.open(p, encoding='utf-8').read()


def write(p, s):
    io.open(p, 'w', encoding='utf-8').write(s)


def extract_dict(html):
    """Изважда L_DICT, като брои скобите, и го оценява с node."""
    i = html.index('var L_DICT')
    j = html.index('=', i) + 1
    depth = 0; start = None; end = None
    for k in range(j, len(html)):
        if html[k] == '{':
            if depth == 0: start = k
            depth += 1
        elif html[k] == '}':
            depth -= 1
            if depth == 0:
                end = k + 1
                break
    if start is None or end is None:
        raise RuntimeError('L_DICT не се намери')
    tmp = '/tmp/_fwdict.js'
    write(tmp, 'const D=' + html[start:end] + ';\nprocess.stdout.write(JSON.stringify(D));')
    out = subprocess.run(['node', tmp], capture_output=True, text=True)
    if out.returncode != 0:
        raise RuntimeError('node не оцени речника: ' + out.stderr[:300])
    return json.loads(out.stdout)


def hreflang_block(current):
    """Списъкът с езиковите близнаци. Влиза във ВСЯКА страница, включително
    българската — иначе Google смята връзката за едностранна и я подминава."""
    rows = ['<!-- Езикови близнаци: казват на Google кой адрес за кой език е. -->']
    for l in LANGS:
        url = BASE if l == 'bg' else BASE + l
        rows.append('<link rel="alternate" hreflang="%s" href="%s">' % (l, url))
    rows.append('<link rel="alternate" hreflang="x-default" href="%s">' % BASE)
    return '\n'.join(rows)


def apply_lang(html, dic, lang):
    """Заменя текста на всеки елемент с data-i18n с превода на този език."""
    def rep(m):
        key = m.group(3)
        val = dic.get(key, {}).get(lang)
        if val is None or str(val).strip() == '':
            return m.group(0)            # няма превод — оставяме както е
        return '<%s%sdata-i18n="%s"%s>%s</%s>' % (
            m.group(1), m.group(2), key, m.group(4), val, m.group(1))
    pat = re.compile(r'<(\w+)([^>]*?)data-i18n="([^"]+)"([^>]*)>(.*?)</\1>', re.S)
    return pat.sub(rep, html)


def apply_lang_my(html, dic, lang):
    """Редчетата под цените („или 111,10 € на година…") не носят data-i18n, а
    data-i18n-m и data-i18n-y — по един текст за месечно и за годишно. Заради
    това предишната замяна ги подминаваше и в седемте страници оставаше
    български текст точно до цените.

    Живият човек не го виждаше: превключвателят месечно/годишно ги пренаписва
    при зареждане. Но Google чете суровия HTML, преди какъвто и да е скрипт —
    и виждаше български. Затова тук се вписва месечният вариант, който е и
    видът по подразбиране на страницата."""
    def rep(m):
        key = m.group(3)
        val = dic.get(key, {}).get(lang)
        if val is None or str(val).strip() == '':
            return m.group(0)
        return '<%s%sdata-i18n-m="%s"%s>%s</%s>' % (
            m.group(1), m.group(2), key, m.group(4), val, m.group(1))
    pat = re.compile(r'<(\w+)([^>]*?)data-i18n-m="([^"]+)"([^>]*)>(.*?)</\1>', re.S)
    return pat.sub(rep, html)


def apply_slug(html, lang):
    """Адресът на писмената подредба. В шаблона стои българският; скриптът на
    страницата го сменя при зареждане, но Google вижда първото. Затова се
    вписва верният още тук."""
    SLUG = {'bg':'pismena-taro-podredba', 'en':'written-tarot-reading',
            'ru':'pismennyy-rasklad-taro', 'de':'schriftliche-tarot-legung',
            'fr':'tirage-de-tarot-ecrit',  'es':'tirada-de-tarot-escrita',
            'it':'stesa-di-tarocchi-scritta', 'pt':'tiragem-de-taro-escrita'}
    if lang not in SLUG:
        return html
    return html.replace('href="/pismena-taro-podredba"',
                        'href="/%s"' % SLUG[lang], 1)


def main():
    if not os.path.isfile(SRC):
        print('Няма %s в тази папка.' % SRC); sys.exit(1)

    src = read(SRC)
    dic = extract_dict(src)
    print('Речник: %d ключа, езици: %s' % (len(dic), ', '.join(sorted(
        set(k for v in dic.values() for k in v.keys())))))

    # ---------- 1) Българският: добавяме само hreflang ----------
    anchor = '<link rel="canonical" href="https://fatedways.com/">'
    if anchor not in src:
        print('Не намирам canonical в %s — спирам, за да не сглася нещо друго.' % SRC)
        sys.exit(1)
    if 'hreflang' in src:
        print('В %s вече има hreflang — не го дублирам.' % SRC)
        bg_out = src
    else:
        bg_out = src.replace(anchor, anchor + '\n' + hreflang_block('bg'))
        write(SRC, bg_out)
        print('%s: добавен hreflang' % SRC)

    # ---------- 2) Останалите седем ----------
    for lang in OUT:
        h = bg_out

        # Езикът на документа
        h = h.replace('<html lang="bg">', '<html lang="%s">' % lang, 1)

        # Заглавие и описание — вградени, за да ги види Google без JavaScript
        name = dic['landing.0'][lang]
        line = dic.get('landing.1', {}).get(lang, '')
        title = 'FatedWays — ' + name
        desc  = (name + '. ' + line).strip()

        h = re.sub(r'<title>.*?</title>', '<title>%s</title>' % title, h, count=1, flags=re.S)
        h = re.sub(r'<meta name="description" content="[^"]*">',
                   '<meta name="description" content="%s">' % desc.replace('"', '&quot;'),
                   h, count=1)

        # Свой каноничен адрес
        h = h.replace('<link rel="canonical" href="https://fatedways.com/">',
                      '<link rel="canonical" href="%s%s">' % (BASE, lang), 1)

        # Отворен граф — за споделяне във Facebook и Viber
        h = re.sub(r'<meta property="og:title" content="[^"]*">',
                   '<meta property="og:title" content="%s">' % title, h, count=1)
        h = re.sub(r'<meta property="og:description" content="[^"]*">',
                   '<meta property="og:description" content="%s">' % line.replace('"', '&quot;'),
                   h, count=1)
        h = re.sub(r'<meta property="og:url" content="[^"]*">',
                   '<meta property="og:url" content="%s%s">' % (BASE, lang), h, count=1)
        h = re.sub(r'<meta property="og:locale" content="[^"]*">',
                   '<meta property="og:locale" content="%s">' % LOCALE[lang], h, count=1)

        # Езикът по подразбиране за тази страница. Ако човекът вече е избирал
        # език, неговият избор пак печели — това е нарочно.
        # 17.09.2026: езикът идва от адреса. Липсва ли белегът, СПИРАМЕ —
        # иначе изпечената страница ще излезе на български.
        old = "var FW_PAGE_LANG='bg';"
        if h.count(old) != 1:
            print('ГРЕШКА (%s): не намерих FW_PAGE_LANG — спирам.' % lang); sys.exit(1)
        h = h.replace(old, "var FW_PAGE_LANG='%s';" % lang, 1)

        # ---- Езикът тръгва нататък със страницата --------------------------
        # Дотук немската страница ЗНАЕШЕ, че е немска, но не го ПРЕДАВАШЕ.
        # Натиснеше ли човек „Ins Spiel eintreten", гейтът (един файл, с
        # lang="bg") питаше localStorage, намираше празно и падаше на езика на
        # браузъра. Германец с английски браузър стигаше до английска врата.
        # Затова тук езикът се записва веднага, но САМО ако още няма записан:
        # избор, направен по-рано от човека, остава непокътнат.
        # Блокът стои най-горе в главата, преди всичко останало да е чело
        # localStorage — заглавието, банерът за бисквитките, езиковото меню.
        seed = ("<script>/* езикът на този файл тръгва и към гейта, ако човекът "
                "още не е избирал */(function(){try{var k='fw_lang';"
                "if(!localStorage.getItem(k))localStorage.setItem(k,'%s');}catch(e){}})();</script>"
                % lang)
        mark = '<meta charset="UTF-8">'
        if mark in h:
            h = h.replace(mark, mark + '\n' + seed, 1)
        else:
            print('  ВНИМАНИЕ (%s): не намерих charset — езикът няма да стигне до гейта' % lang)

        # Целият видим текст
        h = apply_lang(h, dic, lang)
        h = apply_lang_my(h, dic, lang)
        h = apply_slug(h, lang)

        # Белег на ревизията
        h = h.replace('<!-- FatedWays входна страница',
                      '<!-- FatedWays · езикова версия %s · изпечена от %s, не се редактира на ръка\n     FatedWays входна страница' % (lang, SRC), 1)

        out = 'fatedways-%s.html' % lang
        write(out, h)
        print('%s → %s%s' % (out, BASE, lang))

    print('\nГотово. Качи всички файлове в public_html.')


if __name__ == '__main__':
    main()
