#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""Generate StudioSoft invoices — Agustus 2026"""
from fpdf import FPDF
from datetime import date, timedelta
import os

OUTDIR = os.path.dirname(os.path.abspath(__file__))

# ============ HEADER DATA STUDIOSOFT ============
COMPANY = "CV. KREASI STUDIOSOFT"
COMP_ALAMAT = "Jl. Mangga 3 E-346 B, Surabaya"
COMP_TELP = "Phone : 031-71847536 / 081935000624"
BANK = "Bank Mandiri"
BANK_ACC = "142-00-1068384-4"
BANK_NAME = "Uky Yanuhandoko S. Kom"

INVOICE_NO = 101
MONTH_ROMAN = "VIII"
YEAR = "2026"
TANGGAL_INVOICE = date(2026, 8, 1)
JATUH_TEMPO_HARI = 14
PERIODE = "Agustus 2026"

# ============ DATA CLIENT ============
# (nama, alamat kota, [list item dengan (deskripsi, harga)] )
# pakai satu baris "Digital Marketing Fee Maintenance"
clients = [
    ("DAS Bengkel Indonesia", "Indonesia", 3000000),
    ("RSIA Kendangsari", "Surabaya", 2000000),
    ("TSC (The Skin Code Clinic)", "Krian", 3000000),
    ("TS Law (Tito Suprianto Law Firm)", "Indonesia", 3000000),
    ("EveryBe", "Indonesia", 2500000),
    ("Surabaya Skin Centre (SSC)", "Surabaya", 2500000),
    ("LEIT (Leadership-English Institute)", "Surabaya", 3000000),
]

# ============ INVOICE CLASS ============
class Invoice(FPDF):
    def header(self):
        pass

def rupiah(n):
    return "Rp {:,.0f}".format(n).replace(",", ".")

def add_invoice(nama, kota, total, no):
    pdf = Invoice()
    pdf.add_page('P', (210, 297))  # A4 portrait mm
    pdf.set_auto_page_break(auto=True, margin=20)
    pdf.set_margins(20, 18, 20)
    W = 210 - 40  # usable width

    # ---- Title bar ----
    pdf.set_fill_color(31, 41, 55)   # dark slate
    pdf.rect(20, 18, W, 14, 'F')
    pdf.set_font("Helvetica", "B", 13)
    pdf.set_text_color(255, 255, 255)
    pdf.set_xy(24, 21)
    pdf.cell(W - 120, 8, "INVOICE", ln=False)
    pdf.set_font("Helvetica", "", 9)
    pdf.set_xy(W - 20 + 20 - 95, 21)
    pdf.cell(80, 8, "No. %d/INV/%s/%s" % (no, MONTH_ROMAN, YEAR), align="R")

    # ---- Company identity ----
    pdf.set_text_color(20, 20, 20)
    pdf.set_xy(20, 40)
    pdf.set_font("Helvetica", "B", 12)
    pdf.cell(W, 6, COMPANY)
    pdf.set_font("Helvetica", "", 9)
    pdf.set_xy(20, 47)
    pdf.cell(W, 5, COMP_ALAMAT)
    pdf.set_xy(20, 52)
    pdf.cell(W, 5, COMP_TELP)

    # ---- Kepada Yth + tanggal block (right) ----
    pdf.set_font("Helvetica", "B", 10)
    pdf.set_xy(110, 44)
    pdf.cell(80, 6, "Kepada Yth:", align="R")
    pdf.set_font("Helvetica", "", 9)
    pdf.set_xy(110, 50)
    pdf.cell(80, 5, "Pimpinan (%s)" % nama, align="R")
    pdf.set_xy(110, 55)
    pdf.cell(80, 5, kota, align="R")

    # ---- Info invoice (tanggal, jatuh tempo, periode) ----
    y = 66
    pdf.set_font("Helvetica", "B", 9)
    pdf.set_xy(20, y);      pdf.cell(40, 5, "Tanggal Invoice")
    pdf.set_font("Helvetica", "", 9)
    pdf.set_xy(62, y);      pdf.cell(90, 5, TANGGAL_INVOICE.strftime("%d %B %Y"))
    y += 5.5
    jatuh = TANGGAL_INVOICE + timedelta(days=JATUH_TEMPO_HARI)
    pdf.set_font("Helvetica", "B", 9)
    pdf.set_xy(20, y);      pdf.cell(40, 5, "Jatuh Tempo")
    pdf.set_font("Helvetica", "", 9)
    pdf.set_xy(62, y);      pdf.cell(90, 5, jatuh.strftime("%d %B %Y"))
    y += 5.5
    pdf.set_font("Helvetica", "B", 9)
    pdf.set_xy(20, y);      pdf.cell(40, 5, "Periode Layanan")
    pdf.set_font("Helvetica", "", 9)
    pdf.set_xy(62, y);      pdf.cell(90, 5, PERIODE)

    # ---- Item table ----
    y = 82
    # header
    pdf.set_fill_color(229, 231, 235)
    pdf.set_font("Helvetica", "B", 9)
    pdf.set_xy(20, y); pdf.cell(118, 7, "Deskripsi / Item", 1, 0, 'L', True)
    pdf.cell(42, 7, "Total", 1, 0, 'C', True)
    pdf.set_xy(20, y+7)
    pdf.set_font("Helvetica", "", 9.5)
    pdf.cell(118, 9, "  Digital Marketing Fee Maintenance", 1, 0, 'L')
    pdf.cell(42, 9, rupiah(total), 1, 0, 'R')

    # ---- Subtotals ----
    ly = y + 7 + 9
    pdf.set_font("Helvetica", "B", 9)
    pdf.set_xy(20, ly); pdf.cell(118, 7, "Subtotal", 1, 0, 'L')
    pdf.set_font("Helvetica", "", 9)
    pdf.cell(42, 7, rupiah(total), 1, 0, 'R')
    ly += 7
    pdf.set_font("Helvetica", "", 9)
    pdf.set_xy(20, ly); pdf.cell(118, 7, "Total (Termasuk Pajak)", 1, 0, 'L')
    pdf.cell(42, 7, rupiah(total), 1, 0, 'R')
    ly += 7
    pdf.set_fill_color(31, 41, 55)
    pdf.set_font("Helvetica", "B", 10)
    pdf.set_text_color(255, 255, 255)
    pdf.set_xy(20, ly); pdf.cell(118, 8, "TOTAL AMOUNT", 1, 0, 'L', True)
    pdf.cell(42, 8, rupiah(total), 1, 0, 'R', True)

    # ---- Bank info ----
    pdf.set_text_color(20, 20, 20)
    by = ly + 14
    pdf.set_font("Helvetica", "B", 9)
    pdf.set_xy(20, by); pdf.cell(80, 5, "Pembayaran Transfer ke:")
    pdf.set_font("Helvetica", "", 9)
    pdf.set_xy(20, by+6);  pdf.cell(80, 5, "%s" % BANK)
    pdf.set_xy(20, by+11); pdf.cell(80, 5, "Account No. : %s" % BANK_ACC)
    pdf.set_xy(20, by+16); pdf.cell(80, 5, "Account Name : %s" % BANK_NAME)

    # ---- Note / terbilang ----
    pdf.set_font("Helvetica", "I", 8.5)
    pdf.set_xy(110, by+6)
    pdf.cell(80, 5, "Terbilang:", align="R")
    pdf.set_xy(110, by+11)
    pdf.cell(80, 5, terbilang(int(total)), align="R")

    # ---- Closing ----
    pdf.set_xy(20, by+32)
    pdf.set_font("Helvetica", "", 9)
    pdf.cell(W, 5, "Terima kasih atas kepercayaan Anda kepada kami.")
    pdf.set_xy(20, by+37)
    pdf.set_font("Helvetica", "", 9)
    pdf.cell(W, 5, "Hormat kami,")
    pdf.set_xy(20, by+57)
    pdf.set_font("Helvetica", "B", 10)
    pdf.cell(W, 5, "CV. KREASI STUDIOSOFT")
    pdf.set_xy(20, by+63)
    pdf.set_font("Helvetica", "", 9)
    pdf.cell(W, 5, "Uky Yanuhandoko, S. Kom")
    pdf.set_xy(20, by+67)
    pdf.set_font("Helvetica", "", 8.5)
    pdf.cell(W, 5, "Direktur")

    fname = "Invoice_%d_%s.pdf" % (no, nama.replace(" ", "_").replace("(", "").replace(")", "").replace(",", ""))
    path = os.path.join(OUTDIR, fname)
    pdf.output(path)
    return path

# Terbilang sederhana
_SATUAN = ["", "Satu", "Dua", "Tiga", "Empat", "Lima", "Enam", "Tujuh",
           "Delapan", "Sembilan", "Sepuluh", "Sebelas"]
def _baca(n):
    hasil = ""
    if n < 12:
        return _SATUAN[n]
    elif n < 20:
        return _baca(n-10) + " Belas"
    elif n < 100:
        return _baca(n//10) + " Puluh " + _baca(n%10)
    elif n < 200:
        return "Seratus " + _baca(n-100)
    elif n < 1000:
        return _baca(n//100) + " Ratus " + _baca(n%100)
    elif n < 2000:
        return "Seribu " + _baca(n-1000)
    elif n < 1000000:
        return _baca(n//1000) + " Ribu " + _baca(n%1000)
    elif n < 1000000000:
        return _baca(n//1000000) + " Juta " + _baca(n%1000000)
    else:
        return _baca(n//1000000000) + " Miliar " + _baca(n%1000000000)

def terbilang(n):
    return _baca(n).strip().title() + " Rupiah"

# ============ GENERATE ============
paths = []
for i, (nama, kota, total) in enumerate(clients):
    no = INVOICE_NO + i
    p = add_invoice(nama, kota, total, no)
    paths.append((no, nama, total, p))

total_all = sum(c[2] for c in clients)
print("=== GENERATED %d INVOICES ===" % len(paths))
for no, nama, total, p in paths:
    print("No.%d %s -> %s (%s)" % (no, nama, rupiah(total), os.path.basename(p)))
print("TOTAL TAGIHAN: %s" % rupiah(total_all))
