#!/usr/bin/env python3
"""
Jadwalkan artikel StudioSoft yang BELUM ada jadwalnya ke LinkedIn — 1 artikel per hari.
Caption LinkedIn memukau & unik per artikel (generated dari judul + topik).
Mulai dari tanggal yang ditentukan (default 2026-09-01) jam 02:00 UTC (09:00 WIB).
HANYA untuk artikel yang sudah dipastikan kosong (skip yang sudah ada jadwal).
"""
import sys, json, os, re, random
import urllib.request, urllib.error
from datetime import datetime, timezone, timedelta

sys.path.insert(0, '/home/mantapman/.hermes/profiles/atun/workspace')
from repliz_client import HEADERS, BASE

LINKEDIN_ID = '6a334c49c5ff4ce3a32259c9'   # LinkedIn StudioSoft
WIB = timezone(timedelta(hours=7))

# ---- Batas jumlah yang mau dijadwalkan di run ini (0 = semua) ----
BATCH_LIMIT = 0
START_DATE = '2026-09-01'
SCHEDULE_HOUR_WIB = 9   # 09:00 WIB
SCHEDULE_MIN_WIB = 0

def build_caption(art):
    """Buat caption LinkedIn memukau & unik dari judul + link artikel."""
    title = art['title']
    # bersihkan judul dari leading angka/hash '#1 ' ragam
    clean = re.sub(r'^#?\s*\d+\s*', '', title, flags=re.I).strip()
    link = art['link']
    low = title.lower()

    # ==== Pembuka bervariasi (rotasi) supaya tidak monoton ====
    openers = [
        "Banyak pebisnis masih menganggap hal ini sebagai 'nice to have', padahal sekarang jadi kebutuhan utama. Artikel ini mengupasnya dengan jelas.",
        "Kalau selama ini Anda hanya mengandalkan cara lama untuk berkembang, ada satu aspek digital yang mungkin terlewat. Di sinilah jawabannya.",
        "Pertanyaan yang sering muncul dari klien dan audiens kami, kami rangkum lengkap di artikel berikut.",
        "Tren digital bergerak cepat. Yang relevan bulan lalu belum tentu bekerja bulan ini — artikel ini membahas yang paling relevan sekarang.",
        "Untuk Anda yang ingin tumbuh tanpa membuang budget sia-sia, bacaan ini wajib disimak sampai akhir.",
        "Seringkali masalah bisnis bukan di produknya, tapi di cara menjangkau pelanggan. Artikel ini menawarkan sudut pandang praktis.",
    ]
    opener = random.choice(openers)

    # ==== Tubuh berdasarkan topik ====
    body = ""
    if 'seo' in low:
        body = (
            "SEO bukan trik instan — tapi investasi yang hasilnya bertahan lama. Di artikel ini dibahas "
            "langkah-langkah konkret agar website lebih mudah ditemukan di mesin pencari dan mendatangkan "
            "pengunjung yang benar-benar relevan, bukan sekadar ramai."
        )
    elif 'website' in low:
        body = (
            "Website adalah etalase digital bisnis Anda. Artikel ini menjelaskan apa saja yang perlu "
            "diperhatikan dari sisi teknis, desain, hingga strategi pengembangan — supaya website tidak "
            "hanya bagus dilihat, tapi juga efektif menghasilkan pelanggan."
        )
    elif 'digital marketing' in low:
        body = (
            "Digital marketing yang tepat bukan soal membuang banyak budget iklan, tapi soal strategi "
            "yang terukur dan konsisten. Artikel ini merangkum pendekatan yang bisa langsung diterapkan "
            "untuk hasil nyata."
        )
    elif 'social media' in low:
        body = (
            "Media sosial bisa jadi senjata ampuh kalau dikelola dengan strategi, bukan asal posting. "
            "Di artikel ini dibahas cara membangun engagement dan mengelola akun agar mendukung "
            "pertumbuhan brand secara konsisten."
        )
    elif 'branding' in low or 'brand' in low:
        body = (
            "Brand yang kuat bukan sekadar logo cantik — ia terbangun dari positioning, konsistensi, "
            "dan cara berkomunikasi dengan pasar. Artikel ini mengupas cara membangun dan menjaga "
            "brand agar dipercaya pelanggan."
        )
    elif 'backlink' in low:
        body = (
            "Backlink yang berkualitas masih menjadi salah satu faktor penting dalam optimasi website. "
            "Artikel ini membahas strategi mendapatkan backlink yang aman dan bermanfaat, bukan sekadar "
            "tukar-menukar link asal."
        )
    elif 'google maps' in low or 'google business' in low:
        body = (
            "Membuat bisnis muncul di pencarian lokal adalah kunci untuk menjaring pelanggan di sekitar "
            "Anda. Artikel ini menjelaskan langkah praktis mengoptimalkan kehadiran bisnis di pencarian "
            "dan peta online."
        )
    elif 'iklan' in low:
        body = (
            "Iklan digital bisa sangat efektif jika dipasang dengan strategi yang tepat. Artikel ini "
            "membahas cara merancang kampanye yang efisien dan tetap sesuai konteks industri Anda."
        )
    elif 'rumah sakit' in low or 'klinik' in low:
        body = (
            "Di sektor kesehatan, digitalisasi bukan sekadar tren — tapi kebutuhan untuk menjangkau "
            "pasien dengan cara yang tepat dan etis. Artikel ini membahas strategi digital yang relevan "
            "untuk rumah sakit dan klinik."
        )
    elif 'umkm' in low:
        body = (
            "UMKM kini punya peluang besar untuk bersaing secara digital tanpa harus mengeluarkan budget "
            "besar. Artikel ini merangkum strategi yang realistis dan bisa langsung diterapkan pelaku UMKM."
        )
    else:
        body = (
            "Artikel ini menyajikan pembahasan praktis yang bisa langsung diterapkan. Disusun berdasarkan "
            "pengalaman dan riset, cocok untuk Anda yang ingin mengambil langkah nyata di era digital."
        )

    # ==== Closing + CTA + link + hashtag ====
    closing = (
        "Sudah baca artikel lengkapnya? Saya sarankan simpan dulu kalau masih sibuk — informasinya "
        "praktis dan bisa jadi referensi. Klik link di bawah untuk membaca selengkapnya:"
    )

    # ==== Hashtag berdasarkan topik ====
    tags = ["#StudioSoft", "#DigitalMarketing", "#SEO", "#Website"]
    if 'umkm' in low: tags += ["#UMKM"]
    if 'surabaya' in low: tags += ["#Surabaya"]
    if 'sidoarjo' in low: tags += ["#Sidoarjo"]
    if 'malang' in low: tags += ["#Malang"]
    if 'rumah sakit' in low or 'klinik' in low: tags += ["#Kesehatan"]
    tags = list(dict.fromkeys(tags))  # unik, urut stabil

    caption = (
        f"{clean}\n\n"
        f"{opener}\n\n"
        f"{body}\n\n"
        f"{closing}\n\n"
        f"{link}\n\n"
        f"{' '.join(tags)}"
    )
    return caption

def schedule_post(account_id, text, date_str, hour, minute):
    """Jadwalkan post text ke LinkedIn pada tanggal/jam WIB."""
    dt = datetime.strptime(date_str, '%Y-%m-%d').replace(hour=hour, minute=minute, second=0, microsecond=0, tzinfo=WIB)
    schedule_at = dt.strftime('%Y-%m-%dT%H:%M:%S.000Z')
    payload = {
        'title': '',
        'description': text,
        'topic': 'Digital Marketing',
        'type': 'text',
        'medias': [],
        'meta': {'title': '', 'description': '', 'url': ''},
        'additionalInfo': {
            'isAiGenerated': False, 'isDraft': False,
            'collaborators': [], 'mentions': [],
            'music': {'id': '', 'artist': '', 'name': '', 'thumbnail': ''},
            'products': [], 'tags': []
        },
        'replies': [],
        'accountId': account_id,
        'scheduleAt': schedule_at
    }
    body = json.dumps(payload).encode()
    req = urllib.request.Request(f'{BASE}/public/schedule', data=body, headers=HEADERS, method='POST')
    try:
        with urllib.request.urlopen(req) as resp:
            result = json.loads(resp.read())
            return result.get('scheduleId', '?'), schedule_at
    except urllib.error.HTTPError as e:
        return None, f'HTTP {e.code}: {e.read().decode()[:150]}'

def main():
    unused = json.load(open('/tmp/li_unused.json'))
    if BATCH_LIMIT:
        unused = unused[:BATCH_LIMIT]
    print(f"📅 Menjadwalkan {len(unused)} artikel ke LinkedIn StudioSoft (1/hari, mulai {START_DATE} 09:00 WIB)")
    print('=' * 60)

    start = datetime.strptime(START_DATE, '%Y-%m-%d').date()
    used_ids = set()
    log = []
    for i, art in enumerate(unused):
        d = start + timedelta(days=i)
        date_str = d.strftime('%Y-%m-%d')
        caption = build_caption(art)
        sid, info = schedule_post(LINKEDIN_ID, caption, date_str, SCHEDULE_HOUR_WIB, SCHEDULE_MIN_WIB)
        if sid:
            used_ids.add(art['link'])
            log.append({'date': date_str, 'link': art['link'], 'title': art['title'], 'schedule_id': sid})
            print(f"✅ {date_str} 09:00 WIB -> {sid} | {art['title'][:55]}")
        else:
            print(f"❌ {date_str} -> {info} | {art['link']}")
        # update yang sudah dipakai ke used list supaya run berikutnya skip
        with open('/tmp/li_unused.json', 'w') as f:
            remaining = [a for a in unused if a['link'] not in used_ids]
            json.dump(remaining, f, indent=1, ensure_ascii=False)

    # Simpan log
    logpath = '/home/mantapman/.hermes/profiles/atun/workspace/linkedin_studiosoft_schedule_log.json'
    prev = []
    if os.path.exists(logpath):
        try: prev = json.load(open(logpath))
        except: pass
    prev.extend(log)
    with open(logpath, 'w') as f:
        json.dump(prev, f, indent=1, ensure_ascii=False)

    print('=' * 60)
    print(f"✅ Selesai. Total berhasil dijadwalkan: {len(log)}")
    print(f"Log tersimpan: {logpath}")

if __name__ == '__main__':
    main()
