
import os,pprint,datetime
from django.utils.timezone import now
from django.db import connection
from django.conf import settings
from .models import (master as m_master)
from .func import dump
from django.contrib.humanize.templatetags.humanize import intcomma
from webapp.models.master import AuditLog
import fitz
from docx2pdf import convert

import sys
from pdf2image import convert_from_path
import subprocess

from docx import Document
from PIL import Image, ImageDraw, ImageFont



dayList = {
    'Sun' : 'Minggu',
    'Mon' : 'Senin',
    'Tue' : 'Selasa',
    'Wed' : 'Rabu',
    'Thu' : 'Kamis',
    'Fri' : 'Jumat',
    'Sat' : 'Sabtu'
}
monthList = {
    'Jan': 'Januari',
    'Feb': 'Februari',
    'Mar': 'Maret',
    'Apr': 'April',
    'May': 'Mei',
    'Jun': 'Juni',
    'Jul': 'Juli',
    'Aug': 'Agustus',
    'Sep': 'September',
    'Oct': 'Oktober',
    'Nov': 'November',
    'Dec': 'Desember'
}

def update_tgl():
    now = datetime.datetime.now()
    hari = now.strftime("%a")
    tanggal = now.strftime("%d")
    bulan = now.strftime("%b")
    tahunsaiki = now.strftime("%Y")
    tglblntahun = tanggal+' '+monthList[bulan]+' '+tahunsaiki
    if hari == 'Jum':
        hari = 'Fri'
    tgl_lengkap = dayList[hari]+', '+tglblntahun
    return{"tgl_lengkap":tgl_lengkap,"tglblntahun":tglblntahun,"tahunsaiki":tahunsaiki}

def dateISO(date=None):
	if date is None:
		date = datetime.datetime.now()
	return date.isoformat()
# 
def dateFormatted(date=None,format='%Y-%m-%d %H:%M:%S'):
	if date is None:
		date = datetime.datetime.now()
	return datetime.datetime.strftime(date,format)
# 

def template_variables(request):
	session_current = dict(request.session.items())

	date_unique_current = dateFormatted(format='%Y-%m-%d %H')
	if settings.DEBUG:
		date_unique_current = dateISO()

	if session_current['sess_is_auth']:
		m_master.Menus._recursive_validate = lambda menu: m_master.Access._menus_validate(
			menus_pk=menu['pk'],
			roles_pk=session_current['pk_roles'],
			users_pk=session_current['pk'],
		)

	return {
		'debug': settings.DEBUG,
		'session_current': session_current,
		'settings_default': m_master.Settings._default(),
		'date_unique_current': date_unique_current,
		'layout_headbar': m_master.Menus._recursive(pk_parent=0,_is='t',_type='headbar'),
		'layout_sidebar': m_master.Menus._recursive(pk_parent=0,_is='t',_type='sidebar'),
	}
# 

"""
referensi
https://softwareengineering.stackexchange.com/q/200522

pemakaian
from gin.db import query_00
with query_00('SELECT * FROM master.settingtahun a where a.tahun = %s', [str(2019),]) as q:
	for b in q.result():
		print(b)
"""
class query_00:
	def __init__(self, db_sql, db_stmt=[], db_name=None, db_prepare=True):
		self.db_sql = db_sql
		self.db_stmt = db_stmt
		self.db_name = db_name
		self.db_prepare = db_prepare
		self.query = connection.cursor()

	# must return self because
	# AttributeError: 'NoneType' object has no attribute 'result'
	def __enter__(self):
		if self.db_prepare: self.query.execute(self.db_sql,self.db_stmt);
		else: self.query.execute(self.db_sql);

		if self.query and self.query.description: self.fields = [f.name for f in self.query.description];
		else: self.fields = [];

		return self

	# ripped from
	# https://github.com/django/django/blob/master/django/db/utils.py
	def __exit__(self, exc_type, exc_value, traceback):
		if self.query: self.query.close();

	def keyvalue(self,entry):
		return dict(zip(self.fields,entry))

	def result(self):
		for entry in self.query: yield self.keyvalue(entry);

	def result_one(self):
		entry = self.query.fetchone()
		return None if entry is None else self.keyvalue(entry)

	def result_all(self):
		return [b for b in self.result()]
# 


def currency(nominal):
    nominal = round(float(nominal), 2)
    return "Rp. %s%s" % (intcomma(int(nominal)), ("%0.2f" % nominal)[-3:])

arrBulan = {'01':'Januari', '02':'Februari', '03':'Maret', '04':'April', 
	'05':'Mei', '06':'Juni', '07':'Juli', '08':'Agustus',
    '09':'September', '10':'Oktober', '11':'November', '12':'Desember'}

def tgl_indo(tgl):
	pecah   = tgl.split("-")
	return pecah[2]+" "+arrBulan[pecah[1]]+" "+pecah[0]



def update_tgl():
    now = datetime.datetime.now()
    hari = now.strftime("%a")
    tanggal = now.strftime("%d")
    bulan = now.strftime("%b")
    tahunsaiki = now.strftime("%Y")
    jam = now.strftime("%H")
    menit = now.strftime("%M")
    detik = now.strftime("%S")
    tglblntahun = tanggal+' '+monthList[bulan]+' '+tahunsaiki
    tgldetik = tanggal+''+monthList[bulan]+''+tahunsaiki+''+jam+''+menit+''+detik
    if hari == 'Jum':
        hari = 'Fri'
    tgl_lengkap = dayList[hari]+', '+tglblntahun
    return{"tgl_lengkap":tgl_lengkap,"tglblntahun":tglblntahun,"tahunsaiki":tahunsaiki,"tgldetik":tgldetik, }

def log_activity(request, action, content_type, object_pk, description):
    print('📣 log_activity dipanggil:', action, content_type, object_pk, description)  # 👈 DEBUG

    try:
        user_id = request.session.get('pk')

        AuditLog.objects.create(
                user_id=user_id,
                action=action,
                content_type=content_type,
                object_pk=object_pk,
                description=description,
                timestamp=now()
            )


    except Exception as e:
        print('❌ Gagal mencatat log:', e)


#untuk thumbnail file PDF
def create_thumbnail(rel_path):
    """
    Convert halaman pertama PDF ke PNG thumbnail.
    rel_path: path relatif seperti '2025/07/30/file.pdf'
    """
    pdf_full_path = os.path.join(settings.FILE_DIR, rel_path)

    if not pdf_full_path.lower().endswith('.pdf'):
        return None  # Lewatkan jika bukan PDF

    try:
        doc = fitz.open(pdf_full_path)
        page = doc.load_page(0)
        pix = page.get_pixmap()

        output_path = pdf_full_path + ".png"  # Simpan sebagai PDF.png
        if not os.path.exists(output_path):
            pix.save(output_path)
        return output_path
    except Exception as e:
        print("❌ Gagal membuat thumbnail PDF:", e)
        return None
	

#untuk thumbnail PDF dokumen surat
def create_thumbnail_surat(pdf, file_path=settings.FILE_DIR):
	pdffile = file_path+"/"+pdf
	img_name = pdf.split('.pdf')
	doc = fitz.open(pdffile)
	page = doc.load_page(0)  # number of page
	pix = page.get_pixmap()
	output = file_path+"/"+pdf+".png"
	pix.save(output)
	return 'Convert Berhasil '+output+''

def create_thumbnail_word(rel_path, file_path=settings.FILE_DIR):
    full_path = os.path.join(file_path, rel_path)
    base, _ = os.path.splitext(full_path)
    pdf_path = base + ".pdf"
    png_path = base + ".png"

    try:
        if os.name == "nt":  # Windows
            import pythoncom
            pythoncom.CoInitialize()
            try:
                from docx2pdf import convert
                convert(full_path, pdf_path)
            finally:
                pythoncom.CoUninitialize()
        else:  # Linux / Mac
            subprocess.run([
                "soffice", "--headless", "--convert-to", "pdf",
                "--outdir", os.path.dirname(full_path), full_path
            ], check=True)

            if not os.path.exists(pdf_path):
                raise RuntimeError("LibreOffice gagal membuat PDF")

        # render PDF → PNG
        doc = fitz.open(pdf_path)
        page = doc.load_page(0)
        pix = page.get_pixmap()
        pix.save(png_path)

        return png_path

    except Exception as e:
        print(f"⚠️ Gagal membuat thumbnail Word dengan metode PDF: {e}")
        print("➡️ Coba fallback pakai python-docx + Pillow...")

        try:
            from docx import Document
            from PIL import Image, ImageDraw, ImageFont

            doc = Document(full_path)
            text = "\n".join([p.text for p in doc.paragraphs[:15]])

            img = Image.new("RGB", (600, 800), color="white")
            draw = ImageDraw.Draw(img)

            try:
                font = ImageFont.truetype("/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf", 20)
            except:
                font = ImageFont.load_default()

            draw.multiline_text((40, 40), text, fill="black", font=font, spacing=4)

            print("➡️ Simpan thumbnail di:", png_path)
            img.save(png_path)

            return png_path
        except Exception as e2:
            print(f"❌ Gagal fallback thumbnail Word: {e2}")
            return None

# INI TERBARU

# def create_thumbnail_word(rel_path, file_path=settings.FILE_DIR):
#     """
#     Buat thumbnail dari file DOCX/DOC.
#     - Local (dengan Word/LibreOffice): pakai cara asli (Word → PDF → PNG).
#     - Server (tanpa Word/LibreOffice): fallback render teks awal (python-docx + Pillow → PNG).
#     Semua thumbnail disimpan dengan ekstensi .png
#     """
#     full_path = os.path.join(file_path, rel_path)
#     base, _ = os.path.splitext(full_path)
#     pdf_path = base + ".pdf"
#     png_path = base + ".png"   # konsisten PNG

#     try:
#         if os.name == "nt":  # Windows
#             import pythoncom
#             pythoncom.CoInitialize()
#             try:
#                 from docx2pdf import convert
#                 convert(full_path, pdf_path)  # Convert Word → PDF
#             finally:
#                 pythoncom.CoUninitialize()
#         else:  # Linux / Mac
#             # Convert Word → PDF (pakai LibreOffice headless mode)
#             subprocess.run([
#                 "soffice", "--headless", "--convert-to", "pdf",
#                 "--outdir", os.path.dirname(full_path), full_path
#             ], check=True)

#         # Kalau berhasil → render PDF ke PNG
#         doc = fitz.open(pdf_path)
#         page = doc.load_page(0)
#         pix = page.get_pixmap()
#         pix.save(png_path)

#         return png_path

#     except Exception as e:
#         print(f"⚠️ Gagal membuat thumbnail Word dengan metode PDF: {e}")
#         print("➡️ Coba fallback pakai python-docx + Pillow...")

#         # === FALLBACK: render teks awal dengan Pillow ===
#         try:
#             from docx import Document
#             from PIL import Image, ImageDraw, ImageFont

#             doc = Document(full_path)
#             text = "\n".join([p.text for p in doc.paragraphs[:15]])  # ambil beberapa paragraf awal

#             # Buat canvas gambar
#             img = Image.new("RGB", (600, 800), color="white")
#             draw = ImageDraw.Draw(img)

#             try:
#                 font = ImageFont.truetype("DejaVuSans.ttf", 20)
#             except:
#                 font = ImageFont.load_default()

#             # Tulis teks ke gambar
#             draw.multiline_text((40, 40), text, fill="black", font=font, spacing=4)

#             img.save(png_path)
#             return png_path

#         except Exception as e2:
#             print(f"❌ Gagal fallback thumbnail Word: {e2}")
#             return None


# INI YG LAMA

# def create_thumbnail_word(rel_path, file_path=settings.FILE_DIR):
#     """
#     Buat thumbnail JPG dari file DOCX/DOC
#     Cross-platform: Windows pakai pythoncom + docx2pdf,
#                     Linux pakai LibreOffice (soffice).
#     """
#     full_path = os.path.join(file_path, rel_path)
#     base, _ = os.path.splitext(full_path)
#     pdf_path = base + ".pdf"
#     jpg_path = base + ".jpg"

#     try:
#         if os.name == "nt":  # Windows
#             import pythoncom
#             pythoncom.CoInitialize()
#             try:
#                 # Convert Word → PDF (pakai Microsoft Word COM)
#                 convert(full_path, pdf_path)
#             finally:
#                 pythoncom.CoUninitialize()

#         else:  # Linux / Mac
#             # Convert Word → PDF (pakai LibreOffice headless mode)
#             subprocess.run([
#                 "soffice", "--headless", "--convert-to", "pdf",
#                 "--outdir", os.path.dirname(full_path), full_path
#             ], check=True)

#         # Convert PDF → JPG (halaman pertama)
#         doc = fitz.open(pdf_path)
#         page = doc.load_page(0)
#         pix = page.get_pixmap()
#         pix.save(jpg_path)

#         return jpg_path

#     except Exception as e:
#         print(f"❌ Gagal membuat thumbnail Word: {e}")
#         return None