import telebot
from telebot import types
import datetime
import gspread
from oauth2client.service_account import ServiceAccountCredentials
import sys

# 1. SETUP TOKEN TELEGRAM ANDA
API_TOKEN = '8998052104:AAGPNHUgSlCOc5OxQwZRbdvXOU22y82Jmnc'
bot = telebot.TeleBot(API_TOKEN)

# 2. SETUP KONEKSI GOOGLE SHEETS
scope = ["https://spreadsheets.google.com/feeds", "https://www.googleapis.com/auth/drive"]

try:
    creds = ServiceAccountCredentials.from_json_keyfile_name('credentials.json', scope)
    client = gspread.authorize(creds)
    sheet = client.open("Pencatatan Keuangan WiFi").sheet1
    print("✅ Berhasil terhubung ke Google Sheets!")
except Exception as e:
    print(f"❌ KONEKSI GOOGLE SHEETS GAGAL: {e}")
    sys.exit(1)

# Menyimpan data sementara per user chat
user_data = {}

# Fungsi Menu Keyboard Utama
def main_keyboard():
    markup = types.ReplyKeyboardMarkup(row_width=2, resize_keyboard=True)
    btn_pemasukan = types.KeyboardButton('🟢 Pemasukan Kas')
    btn_pengeluaran = types.KeyboardButton('🔴 Pengeluaran Kas')
    btn_rekap = types.KeyboardButton('📊 Rekap Akumulasi')
    btn_bulan = types.KeyboardButton('📅 Laporan Bulan Ini')
    btn_pilih_bulan = types.KeyboardButton('📆 Rekap Bulan Lain')
    btn_batal = types.KeyboardButton('🗑️ Batalkan Transaksi Terakhir')
    
    markup.add(btn_pemasukan, btn_pengeluaran)
    markup.add(btn_rekap, btn_bulan)
    markup.add(btn_pilih_bulan, btn_batal)
    return markup

@bot.message_handler(commands=['start', 'help'])
def send_welcome(message):
    bot.send_message(message.chat.id, 
                     "📊 **SISTEM MANAJEMEN KEUANGAN NETWORK**\n\n"
                     "Sistem pencatatan kas internal siap digunakan. Silakan pilih menu interaksi di bawah ini.",
                     reply_markup=main_keyboard(), 
                     parse_mode="Markdown")

# --- ALUR INPUT PEMASUKAN ---
@bot.message_handler(func=lambda message: message.text == '🟢 Pemasukan Kas' or message.text == '/pemasukan')
def start_pemasukan(message):
    chat_id = message.chat.id
    user_data[chat_id] = {'kategori': 'Pemasukan'}
    msg = bot.send_message(chat_id, "📝 Masukkan **KETERANGAN/SUMBER PEMASUKAN**:\n*(Contoh: Iuran Bulanan Ahmad, Penjualan Voucher, Net-Biz)*", 
                           reply_markup=types.ReplyKeyboardRemove(), parse_mode="Markdown")
    bot.register_next_step_handler(msg, process_description)

# --- ALUR INPUT PENGELUARAN ---
@bot.message_handler(func=lambda message: message.text == '🔴 Pengeluaran Kas' or message.text == '/pengeluaran')
def start_pengeluaran(message):
    chat_id = message.chat.id
    user_data[chat_id] = {'kategori': 'Pengeluaran'}
    msg = bot.send_message(chat_id, "📝 Masukkan **KETERANGAN PENGELUARAN**:\n*(Contoh: Pembelian Kabel FO, Bandwidth Bulanan, Transport)*", 
                           reply_markup=types.ReplyKeyboardRemove(), parse_mode="Markdown")
    bot.register_next_step_handler(msg, process_description)

def process_description(message):
    chat_id = message.chat.id
    user_data[chat_id]['keterangan'] = message.text
    msg = bot.send_message(chat_id, f"💰 Masukkan **NOMINAL/JUMLAH DANA** (Angka saja tanpa titik/koma):", parse_mode="Markdown")
    bot.register_next_step_handler(msg, process_amount)

def process_amount(message):
    chat_id = message.chat.id
    try:
        amount = int(message.text)
        tanggal = datetime.datetime.now().strftime("%Y-%m-%d %H:%M")
        data = user_data[chat_id]
        
        sheet.append_row([tanggal, data['kategori'], data['keterangan'], amount])
        
        respon = (f"✅ **Transaksi Berhasil Dibukukan!**\n\n"
                  f"📅 Waktu: {tanggal}\n"
                  f"📁 Klasifikasi: {data['kategori']}\n"
                  f"📝 Deskripsi: {data['keterangan']}\n"
                  f"💰 Nominal: Rp {amount:,}")
                  
        bot.send_message(chat_id, respon, parse_mode="Markdown", reply_markup=main_keyboard())
        del user_data[chat_id]
        
    except ValueError:
        msg = bot.send_message(chat_id, "⚠️ Format nominal tidak valid. Masukkan kembali angka tanpa tanda baca:")
        bot.register_next_step_handler(msg, process_amount)
    except Exception as e:
        bot.send_message(chat_id, f"❌ Gagal memperbarui pembukuan: {e}", reply_markup=main_keyboard())

# --- LAPORAN REKAP AKUMULASI (ALL TIME) ---
@bot.message_handler(func=lambda message: message.text == '📊 Rekap Akumulasi' or message.text == '/rekap')
def get_rekap(message):
    bot.send_message(message.chat.id, "🔄 Mengambil ringkasan dari database...")
    try:
        all_records = sheet.get_all_records()
        total_pemasukan = sum(int(row.get('Jumlah', 0)) for row in all_records if str(row.get('Kategori', '')).strip().lower() == 'pemasukan')
        total_pengeluaran = sum(int(row.get('Jumlah', 0)) for row in all_records if str(row.get('Kategori', '')).strip().lower() == 'pengeluaran')
        saldo_bersih = total_pemasukan - total_pengeluaran
        
        laporan = (f"📊 **LAPORAN REKAPITULASI KAS AKUMULASI**\n\n"
                   f"🟢 Total Pemasukan: Rp {total_pemasukan:,}\n"
                   f"🔴 Total Pengeluaran: Rp {total_pengeluaran:,}\n"
                   f"----------------------------------------\n"
                   f"💰 **Saldo Kas Saat Ini:** Rp {saldo_bersih:,}")
        bot.send_message(message.chat.id, laporan, parse_mode="Markdown", reply_markup=main_keyboard())
    except Exception as e:
        bot.send_message(message.chat.id, f"❌ Gagal memuat data laporan: {e}", reply_markup=main_keyboard())

# --- LAPORAN BULAN BERJALAN ---
@bot.message_handler(func=lambda message: message.text == '📅 Laporan Bulan Ini' or message.text == '/bulanini')
def get_rekap_bulan_ini(message):
    bot.send_message(message.chat.id, "🔄 Menyaring neraca bulan berjalan...")
    try:
        all_records = sheet.get_all_records()
        bulan_sekarang = datetime.datetime.now().strftime("%Y-%m")
        
        total_pemasukan = 0
        total_pengeluaran = 0
        
        for row in all_records:
            tgl_row = str(row.get('Tanggal', ''))
            if tgl_row.startswith(bulan_sekarang):
                kategori = str(row.get('Kategori', '')).strip().lower()
                jumlah = int(row.get('Jumlah', 0))
                if kategori == 'pemasukan':
                    total_pemasukan += jumlah
                elif kategori == 'pengeluaran':
                    total_pengeluaran += jumlah
                    
        saldo_bulan = total_pemasukan - total_pengeluaran
        nama_bulan = datetime.datetime.now().strftime("%B %Y")
        
        laporan = (f"📅 **LAPORAN ARUS KAS PERIODE: {nama_bulan}**\n\n"
                   f"🟢 Pemasukan Bulan Ini: Rp {total_pemasukan:,}\n"
                   f"🔴 Pengeluaran Bulan Ini: Rp {total_pengeluaran:,}\n"
                   f"----------------------------------------\n"
                   f"💰 **Laba Bersih Berjalan:** Rp {saldo_bulan:,}")
        bot.send_message(message.chat.id, laporan, parse_mode="Markdown", reply_markup=main_keyboard())
    except Exception as e:
        bot.send_message(message.chat.id, f"❌ Gagal memuat data bulanan: {e}", reply_markup=main_keyboard())

# --- FITUR ARSIP BULAN SEBELUMNYA (LOGIKA FIXED & AMAN) ---
@bot.message_handler(func=lambda message: message.text == '📆 Rekap Bulan Lain' or message.text == '/bulanlain')
def choose_month(message):
    try:
        markup = types.InlineKeyboardMarkup(row_width=3)
        now = datetime.datetime.now()
        months_buttons = []
        
        # Nama bulan dalam bahasa Indonesia untuk label tombol
        nama_bulan_indo = {
            1: "Jan", 2: "Feb", 3: "Mar", 4: "Apr", 5: "Mei", 6: "Jun",
            7: "Jul", 8: "Agt", 9: "Sep", 10: "Okt", 11: "Nov", 12: "Des"
        }
        
        # Membuat 6 daftar bulan ke belakang secara matematis yang pasti pas
        for i in range(1, 7):
            # Hitung mundur bulan
            tahun_target = now.year
            bulan_target = now.month - i
            
            while bulan_target <= 0:
                bulan_target += 12
                tahun_target -= 1
                
            bln_code = f"{tahun_target}-{bulan_target:02d}" # Format: 2026-06
            label_nama = f"{nama_bulan_indo[bulan_target]} {str(tahun_target)[2:]}" # Format: Jun 26
            
            months_buttons.append(types.InlineKeyboardButton(text=label_nama, callback_data=f"rk_{bln_code}_{label_nama}"))
            
        markup.add(*months_buttons)
        bot.send_message(message.chat.id, "📆 Silakan pilih periode bulan yang ingin Anda rekap:", reply_markup=markup)
    except Exception as e:
        bot.send_message(message.chat.id, f"❌ Gagal memunculkan daftar bulan: {e}")

# Callback Query Handler untuk memproses tombol Inline yang diklik
@bot.callback_query_handler(func=lambda call: call.data.startswith('rk_'))
def process_callback_rekap(call):
    # Memisahkan data dari data tombol callback
    _, bln_code, label_nama = call.data.split('_')
    
    bot.answer_callback_query(call.id, text=f"Sedang menghitung periode {label_nama}...")
    
    try:
        all_records = sheet.get_all_records()
        total_pemasukan = 0
        total_pengeluaran = 0
        
        for row in all_records:
            tgl_row = str(row.get('Tanggal', ''))
            if tgl_row.startswith(bln_code):
                kategori = str(row.get('Kategori', '')).strip().lower()
                jumlah = int(row.get('Jumlah', 0))
                if kategori == 'pemasukan':
                    total_pemasukan += jumlah
                elif kategori == 'pengeluaran':
                    total_pengeluaran += jumlah
                    
        saldo_bulan = total_pemasukan - total_pengeluaran
        
        laporan = (f"📊 **LAPORAN ARUS KAS PERIODE: {label_nama}**\n\n"
                   f"🟢 Pemasukan: Rp {total_pemasukan:,}\n"
                   f"🔴 Pengeluaran: Rp {total_pengeluaran:,}\n"
                   f"----------------------------------------\n"
                   f"💰 **Laba Bersih Akhir:** Rp {saldo_bulan:,}")
                   
        bot.send_message(call.message.chat.id, laporan, parse_mode="Markdown")
    except Exception as e:
        bot.send_message(call.message.chat.id, f"❌ Gagal memproses data periode {label_nama}: {e}")

# --- PEMBATALAN TRANSAKSI TERAKHIR ---
@bot.message_handler(func=lambda message: message.text == '🗑️ Batalkan Transaksi Terakhir' or message.text == '/batal')
def cancel_last_input(message):
    try:
        all_values = sheet.get_all_values()
        total_rows = len(all_values)
        if total_rows <= 1:
            bot.send_message(message.chat.id, "❌ Tidak ditemukan jurnal transaksi aktif untuk dihapus.", reply_markup=main_keyboard())
            return
            
        last_row_data = all_values[-1]
        sheet.delete_rows(total_rows)
        
        respon = (f"🗑️ **Jurnal Transaksi Terakhir Berhasil Dihapus!**\n\n"
                  f"📅 Waktu: {last_row_data[0]}\n"
                  f"📁 Klasifikasi: {last_row_data[1]}\n"
                  f"📝 Deskripsi: {last_row_data[2]}\n"
                  f"💰 Nominal: Rp {int(last_row_data[3]):,}")
        bot.send_message(message.chat.id, respon, parse_mode="Markdown", reply_markup=main_keyboard())
    except Exception as e:
        bot.send_message(message.chat.id, f"❌ Gagal mengeksekusi pembatalan: {e}", reply_markup=main_keyboard())

# Jalankan bot
bot.polling()
