from flask import render_template, redirect, session, request
from extensions import app, mysql

# Import route autentikasi
import routes.auth
import routes.barang
import routes.gudang
import routes.kasir
import routes.ann

from flask import (
    Flask,
    render_template,
    request,
    redirect,
    session,
    flash
)


# ==========================================================
# HALAMAN PUBLIK
# Bisa diakses tanpa login
# ==========================================================
@app.route("/")
def index():
    cari = request.args.get("cari", "").strip()
    try:
        periode_hari = int(request.args.get("periode", 7))
    except (TypeError, ValueError):
        periode_hari = 7
    if periode_hari not in (3, 7, 14, 30):
        periode_hari = 7

    cursor = mysql.connection.cursor()
    query = """
        SELECT b.id,b.kode_barang,b.nama_barang,b.kategori,b.satuan_besar,
               b.satuan_kecil,b.isi_per_satuan,b.stok_kecil,
               hp.prediksi_kebutuhan,hp.stok_saat_prediksi,
               hp.rekomendasi_stok,hp.tanggal_prediksi,hp.tanggal_habis
        FROM barang b
        LEFT JOIN hasil_prediksi hp
          ON hp.barang_id=b.id AND hp.periode_hari=%s
        WHERE 1=1
    """
    params=[periode_hari]
    if cari:
        query += """ AND (b.nama_barang LIKE %s OR b.kode_barang LIKE %s OR b.kategori LIKE %s) """
        k=f"%{cari}%"; params.extend([k,k,k])
    query += """
        ORDER BY
          CASE
            WHEN hp.rekomendasi_stok IS NULL THEN 3
            WHEN hp.rekomendasi_stok <= 0 THEN 0
            WHEN hp.rekomendasi_stok <= GREATEST(5, ROUND(b.stok_kecil*0.25)) THEN 1
            ELSE 2
          END,
          hp.rekomendasi_stok ASC, b.nama_barang ASC
    """
    cursor.execute(query, tuple(params))
    data=cursor.fetchall()
    cursor.close()

    barang=[]
    for item in data:
        sisa=item[10]
        status="Belum Tersedia"; status_class="secondary"
        if sisa is not None:
            batas=max(5, round(item[7]*0.25))
            if float(sisa)<=0:
                status="Berpotensi Habis"; status_class="danger"
            elif float(sisa)<=batas:
                status="Menipis"; status_class="warning"
            else:
                status="Aman"; status_class="success"
        barang.append({
            "id":item[0],"kode_barang":item[1],"nama_barang":item[2],
            "kategori":item[3],"satuan_besar":item[4],"satuan_kecil":item[5],
            "isi_per_satuan":item[6],"stok_kecil":item[7],
            "prediksi_kebutuhan":item[8],"stok_saat_prediksi":item[9],
            "prediksi_sisa_stok":item[10],"tanggal_prediksi":item[11],
            "tanggal_habis":item[12],
            "status":status,"status_class":status_class
        })
    return render_template("public/index.html", barang=barang,
                           periode_hari=periode_hari, cari=cari)


# ==========================================================
# DASHBOARD ADMIN
# ==========================================================
@app.route("/admin")
def admin_dashboard():

    # Cek login
    if "login" not in session:
        return redirect("/login")

    # Cek hak akses
    if session.get("role") != "admin":
        return redirect("/login")

    cursor = mysql.connection.cursor()

    # ------------------------------------------------------
    # TOTAL JENIS BARANG
    # ------------------------------------------------------
    cursor.execute(
        """
        SELECT COUNT(*)
        FROM barang
        """
    )

    total_barang = cursor.fetchone()[0]


    # ------------------------------------------------------
    # TOTAL BARANG MASUK HARI INI
    # Menggunakan jumlah dalam satuan terkecil
    # ------------------------------------------------------
    cursor.execute(
        """
        SELECT
            COALESCE(SUM(dtm.jumlah_kecil), 0)

        FROM detail_transaksi_masuk dtm

        INNER JOIN transaksi_masuk tm
            ON dtm.transaksi_masuk_id = tm.id

        WHERE DATE(tm.tanggal) = CURDATE()
        """
    )

    barang_masuk_hari_ini = cursor.fetchone()[0]


    # ------------------------------------------------------
    # TOTAL BARANG KELUAR HARI INI
    # Menggunakan jumlah dalam satuan terkecil
    # ------------------------------------------------------
    cursor.execute(
        """
        SELECT
            COALESCE(SUM(dtk.jumlah_kecil), 0)

        FROM detail_transaksi_keluar dtk

        INNER JOIN transaksi_keluar tk
            ON dtk.transaksi_keluar_id = tk.id

        WHERE DATE(tk.tanggal) = CURDATE()
        """
    )

    barang_keluar_hari_ini = cursor.fetchone()[0]


    # ------------------------------------------------------
    # TOTAL DATA HASIL PREDIKSI
    # ------------------------------------------------------
    cursor.execute(
        """
        SELECT COUNT(*)
        FROM hasil_prediksi
        """
    )

    total_prediksi = cursor.fetchone()[0]

    cursor.close()


    # ------------------------------------------------------
    # TAMPILKAN DASHBOARD
    # ------------------------------------------------------
    return render_template(
        "admin/dashboard.html",
        total_barang=total_barang,
        barang_masuk_hari_ini=barang_masuk_hari_ini,
        barang_keluar_hari_ini=barang_keluar_hari_ini,
        total_prediksi=total_prediksi
    )


# ==========================================================
# DASHBOARD SEMENTARA GUDANG
# ==========================================================
@app.route("/gudang")
def gudang_dashboard():

    if "login" not in session:
        return redirect("/login")

    if session.get("role") != "gudang":
        return redirect("/login")


    cursor = mysql.connection.cursor()


    # ======================================================
    # TOTAL JENIS BARANG
    # ======================================================

    cursor.execute(
        """
        SELECT COUNT(*)
        FROM barang
        """
    )

    total_barang = cursor.fetchone()[0]


    # ======================================================
    # TOTAL BARANG MASUK HARI INI
    # DALAM SATUAN TERKECIL
    # ======================================================

    cursor.execute(
        """
        SELECT
            COALESCE(
                SUM(dtm.jumlah_kecil),
                0
            )
        FROM detail_transaksi_masuk dtm

        INNER JOIN transaksi_masuk tm
            ON dtm.transaksi_masuk_id = tm.id

        WHERE DATE(tm.tanggal) = CURDATE()
        """
    )

    barang_masuk_hari_ini = cursor.fetchone()[0]


    # ======================================================
    # TOTAL STOK SELURUH BARANG
    # ======================================================

    cursor.execute(
        """
        SELECT
            COALESCE(
                SUM(stok_kecil),
                0
            )
        FROM barang
        """
    )

    total_stok = cursor.fetchone()[0]


    cursor.close()


    return render_template(
        "gudang/dashboard.html",
        total_barang=total_barang,
        barang_masuk_hari_ini=barang_masuk_hari_ini,
        total_stok=total_stok
    )


# ==========================================================
# DASHBOARD KASIR
# ==========================================================
@app.route("/kasir")
def kasir_dashboard():

    if "login" not in session:
        return redirect("/login")

    if session.get("role") != "kasir":
        return redirect("/login")


    cursor = mysql.connection.cursor()


    # ======================================================
    # TOTAL JENIS BARANG
    # ======================================================
    cursor.execute(
        """
        SELECT COUNT(*)
        FROM barang
        """
    )

    data_total_barang = cursor.fetchone()

    total_barang = (
        data_total_barang[0]
        if data_total_barang
        else 0
    )


    # ======================================================
    # JUMLAH TRANSAKSI HARI INI
    # ======================================================
    cursor.execute(
        """
        SELECT COUNT(*)
        FROM transaksi_keluar
        WHERE DATE(tanggal) = CURDATE()
        """
    )

    data_transaksi = cursor.fetchone()

    transaksi_hari_ini = (
        data_transaksi[0]
        if data_transaksi
        else 0
    )


    # ======================================================
    # BARANG KELUAR HARI INI
    # DALAM UNIT TERKECIL
    # ======================================================
    cursor.execute(
        """
        SELECT
            COALESCE(
                SUM(dtk.jumlah_kecil),
                0
            )
        FROM detail_transaksi_keluar dtk

        INNER JOIN transaksi_keluar tk
            ON dtk.transaksi_keluar_id = tk.id

        WHERE DATE(tk.tanggal) = CURDATE()
        """
    )

    data_barang_keluar = cursor.fetchone()

    barang_keluar_hari_ini = (
        data_barang_keluar[0]
        if data_barang_keluar
        else 0
    )


    # ======================================================
    # TOTAL NILAI PENJUALAN HARI INI
    # ======================================================
    cursor.execute(
        """
        SELECT
            COALESCE(
                SUM(total),
                0
            )
        FROM transaksi_keluar
        WHERE DATE(tanggal) = CURDATE()
        """
    )

    data_penjualan = cursor.fetchone()

    total_penjualan_hari_ini = (
        data_penjualan[0]
        if data_penjualan
        else 0
    )


    cursor.close()


    return render_template(
        "kasir/dashboard.html",
        total_barang=total_barang,
        transaksi_hari_ini=transaksi_hari_ini,
        barang_keluar_hari_ini=barang_keluar_hari_ini,
        total_penjualan_hari_ini=total_penjualan_hari_ini
    )


# ==========================================================
# MENJALANKAN APLIKASI
# ==========================================================
if __name__ == "__main__":
    app.run(debug=True)