from datetime import datetime
import sqlite3
import os
import html

def get_rows(conn, sql, params=None):
    """Helper to fetch all rows for a query."""
    with conn:
        cur = conn.cursor()
        if params:
            cur.execute(sql, params)
        else:
            cur.execute(sql)
        return cur.fetchall()

def write_html_file(file_path, file_name, html_content):
    """Helper to write HTML to file."""
    with open(os.path.join(file_path, file_name), 'w', encoding="utf-8") as fp:
        fp.write(html_content)

def build_table(headers, rows, link_cols=None, nowrap_cols=None):
    """Builds a Bootstrap-styled HTML table."""
    link_cols = link_cols or []
    nowrap_cols = nowrap_cols or []
    table = '<table class="table table-bordered"><thead><tr bgcolor="64b8c0">'
    for header in headers:
        table += f"<th>{html.escape(header)}</th>"
    table += "</tr></thead><tbody>"
    for idx, row in enumerate(rows, 1):
        bgcolor = "#ffffff" if idx % 2 else "#dfdfdf"
        table += f'<tr bgcolor="{bgcolor}"><td>{idx}</td>'
        for col_idx, cell in enumerate(row):
            cell_content = html.escape(str(cell))
            td_attrs = ""
            if col_idx in link_cols:
                cell_content = f'<a href="{cell_content}">{cell_content}</a>'
            if col_idx in nowrap_cols:
                td_attrs = ' nowrap'
            table += f"<td{td_attrs}>{cell_content}</td>"
        table += "</tr>"
    table += "</tbody></table>"
    return table

def build_header(date_time, unplayed):
    """Builds the HTML header and navigation."""
    header1 = (
        '<header><style> #intro {background-image: url("viking-wallpaper.jpg"); height: 120vh;} '
        '@media (min-width: 992px) {#intro {margin-top: -1px;}} .navbar .nav-link {color: #fff !important;} '
        'h1 {color: rgb(0, 0, 0); text-align: center;}audio {filter: sepia(20%) saturate(70%) grayscale(1) '
        'contrast(99%) invert(12%);width: 100px;height: 20px;}</style>'
    )
    header2 = (
        '<nav class="navbar navbar-expand-lg" style="background-color: #c06c64">'
        '<div class="container-fluid"><a class="navbar-brand" href="index.html"> Viking Utilities ~ &copy; 2023 </a>'
        '<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent" '
        'aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">'
        '<span class="navbar-toggler-icon"></span></button>'
        '<div class="collapse navbar-collapse" id="navbarSupportedContent">'
        '<ul class="navbar-nav me-auto mb-2 mb-lg-0">'
        '<li class="nav-item"><a class="nav-link active" href="enorindex.html"> Main </a></li>'
        '<li class="nav-item"><a class="nav-link active" href="enorqueue-errors.html"> Q-Errors </a></li>'
        '<li class="nav-item"><a class="nav-link active" href="enorurichanges.html"> URI Changes </a></li>'
        '<li class="nav-item"><a class="nav-link active" href="enorduplicates.html"> Duplicates </a></li>'
        '<li class="nav-item"><a class="nav-link active" href="release-date.html"> Unknown Release </a></li>'
        '<li class="nav-item dropdown"><a class="nav-link dropdown-toggle" role="button" data-bs-toggle="dropdown" aria-expanded="false"> Last Played </a>'
        '<ul class="dropdown-menu">'
        '<li><a class="dropdown-item" href="enorplayed-epm.html"> Played[EPM] </a></li>'
        '<li><a class="dropdown-item" href="enorplayed-ext.html"> Played[EXT] </a></li>'
        '</ul></li>'
        '<li class="nav-item"><a class="nav-link active" href="https://www.python.org" target="_blank"> PYTHON </a></li>'
        '<li class="nav-item"><a class="nav-link active" href="https://www.sqlite.org" target="_blank"> SQLITE3 </a></li>'
        '<li class="nav-item"><a class="nav-link active" href="https://developer.spotify.com/documentation/web-api/reference/#/" target="_blank"> SPOTIFY WEB API </a></li>'
        '<li class="nav-item"><a class="nav-link active" href="https://html.com/" target="_blank"> HTML </a></li>'
        '<li class="nav-item"><span class="navbar-text"><h3><i> E. P. M. S. </i></h3></span></li>'
        '</ul></div></div></nav></header>'
    )
    head = (
        "<head><meta charset='UTF-8'><title>Endless Playlist Management System</title>"
        "<link href='https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/css/bootstrap.min.css' rel='stylesheet'>"
        "<script src='https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/js/bootstrap.bundle.min.js'></script></head>"
    )
    body1 = (
        '<body><div id="intro" class="bg-image shadow-2-strong"><div class="container">'
        '<table class="table"><table border="0" align="center" cellpadding="50" cellspacing="15">'
        '<tr><td><table border="1" bgcolor="64b8c0" align="center" cellpadding="3" cellspacing="3"><tr>'
    )
    body2 = f'<td><b> Remaining Unplayed Tracks = {unplayed}</b></td></tr></table></td></tr></table></table>'
    body3 = '<table class="table"><table border="0" align="center" cellpadding="3" cellspacing="15"><tr><td>'
    return head + header1 + header2, body1, body2, body3

def main():
    print('HTML BUILDER v7.0.0')
    now = datetime.now()
    date_time = now.strftime('%d-%m-%y @ %H:%M')
    yearis = now.strftime('%Y')
    filename = r"J:\Spotty\secrets_and_database\Enormous Feed.db"
    file_path = r'J:\HGMS\VIKING-WEB'

    try:
        conn = sqlite3.connect(filename)
        # Unplayed tracks count
        unplayed = str(get_rows(conn, "SELECT COUNT(*) FROM Track_List WHERE QUEUED = 0")[0][0])
        main_head, body1, body2, body3 = build_header(date_time, unplayed)

        # [1] Last Run Additions
        rows = get_rows(conn, "SELECT * FROM Last_Run_Additions")
        additiondata = "Last Run Additions: " + date_time
        body4 = f'<table border="1" bgcolor="64b8c0" align="center" cellpadding="3" cellspacing="3"><tr><td><b>{additiondata}</b></td></tr></table></td></tr></table></table>'
        headers = ["#", "URI", "TRACK", "ARTIST", "ALBUM"]
        table = build_table(headers[1:], rows, link_cols=[0])
        html_content = main_head + body1 + body2 + body3 + body4 + table + '</tbody></table></div></div></body>'
        write_html_file(file_path, "enoradditions.html", html_content)

        # [2] Last Run Deletions
        rows = get_rows(conn, "SELECT * FROM Last_Run_Deletions")
        deletiondata = "Last Run Deletions: " + date_time
        body4 = f'<table border="1" bgcolor="64b8c0" align="center" cellpadding="3" cellspacing="3"><tr><td><b>{deletiondata}</b></td></tr></table></td></tr></table></table>'
        table = build_table(headers[1:], rows, link_cols=[0])
        html_content = main_head + body1 + body2 + body3 + body4 + table + '</tbody></table></div></div></body>'
        write_html_file(file_path, "enordeletions.html", html_content)

        # [3] Duplicated tracks
        rows = get_rows(conn, "SELECT * FROM New_Dupe_Tracks WHERE REVIEWED = 0")
        dupedata = "Duplicated Tracks: " + date_time
        body4 = f'<table border="1" bgcolor="64b8c0" align="center" cellpadding="3" cellspacing="3"><tr><td><b>{dupedata}</b></td></tr></table></td></tr></table></table>'
        headers_dupe = ["#", "URI", "TRACK", "ARTIST", "REVIEWED"]
        table = build_table(headers_dupe[1:], rows, link_cols=[0])
        html_content = main_head + body1 + body2 + body3 + body4 + table + '</tbody></table></div></div></body>'
        write_html_file(file_path, "enorduplicates.html", html_content)

        # [4] URI Changes
        rows = get_rows(conn, f"SELECT * FROM URI_Change WHERE DATE_OF_CHANGE LIKE ? ORDER by DATE_OF_CHANGE DESC LIMIT 100", (f"%{yearis}%",))
        uridata = "URI Changes: " + date_time
        body4 = f'<table border="1" bgcolor="64b8c0" align="center" cellpadding="3" cellspacing="3"><tr><td><b>{uridata}</b></td></tr></table></td></tr></table></table>'
        headers_uri = ["#", "DATE", "OLD URI", "NEW URI", "TRACK", "ARTIST"]
        # row[5]=DATE, row[1]=OLD URI, row[2]=NEW URI, row[3]=TRACK, row[4]=ARTIST
        table_rows = [[row[5], row[1], row[2], row[3], row[4]] for row in rows]
        table = build_table(headers_uri[1:], table_rows, link_cols=[1,2], nowrap_cols=[0])
        html_content = main_head + body1 + body2 + body3 + body4 + table + '</tbody></table></div></div></body>'
        write_html_file(file_path, "enorurichanges.html", html_content)

        # [5a] Last_Played_Tracks (EPM)
        rows = get_rows(conn, f"SELECT * FROM Last_Played_Tracks WHERE PLAY_COUNT != -100 AND LAST_PLAYED LIKE ? ORDER BY LAST_PLAYED DESC LIMIT 100", (f"%{yearis}%",))
        epmdata = "Last Played Tracks (EPM): " + date_time
        body4 = f'<table border="1" bgcolor="64b8c0" align="center" cellpadding="3" cellspacing="3"><tr><td><b>{epmdata}</b></td></tr></table></td></tr></table></table>'
        headers_played = ["#", "URI", "TRACK", "ARTIST", "PLAYED"]
        table_rows = [[row[0], row[1], row[2], row[5]] for row in rows]
        table = build_table(headers_played[1:], table_rows, link_cols=[0], nowrap_cols=[3])
        html_content = main_head + body1 + body2 + body3 + body4 + table + '</tbody></table></div></div></body>'
        write_html_file(file_path, "enorplayed-epm.html", html_content)

        # [5b] Last_Played_Tracks (EXT)
        rows = get_rows(conn, f"SELECT * FROM Last_Played_Tracks WHERE PLAY_COUNT = -100 AND LAST_PLAYED LIKE ? ORDER BY LAST_PLAYED DESC LIMIT 100", (f"%{yearis}%",))
        extdata = "Last Played Tracks (EXT): " + date_time
        body4 = f'<table border="1" bgcolor="64b8c0" align="center" cellpadding="3" cellspacing="3"><tr><td><b>{extdata}</b></td></tr></table></td></tr></table></table>'
        table_rows = [[row[0], row[1], row[2], row[5]] for row in rows]
        table = build_table(headers_played[1:], table_rows, link_cols=[0], nowrap_cols=[3])
        html_content = main_head + body1 + body2 + body3 + body4 + table + '</tbody></table></div></div></body>'
        write_html_file(file_path, "enorplayed-ext.html", html_content)

        # [6] Queue Check
        rows = get_rows(conn, "SELECT * FROM Queue_check")
        queuedata = "Queue Errors: " + date_time
        body4 = f'<table border="1" bgcolor="64b8c0" align="center" cellpadding="3" cellspacing="3"><tr><td><b>{queuedata}</b></td></tr></table></td></tr></table></table>'
        table = build_table(headers[1:], rows, link_cols=[0])
        html_content = main_head + body1 + body2 + body3 + body4 + table + '</tbody></table></div></div></body>'
        write_html_file(file_path, "enorqueue-errors.html", html_content)

        # [8] Tracks with Unknown Release Dates
        rows = get_rows(conn, "SELECT * FROM Track_List WHERE RELEASE_DATE = 9999")
        unknown = "Latest Update: " + date_time
        body4 = f'<table border="1" bgcolor="64b8c0" align="center" cellpadding="3" cellspacing="3"><tr><td><b>{unknown}</b></td></tr></table></td></tr></table></table>'
        table = build_table(headers[1:], rows, link_cols=[0])
        html_content = main_head + body1 + body2 + body3 + body4 + table + '</tbody></table></div></div></body>'
        write_html_file(file_path, "release-date.html", html_content)

        # [7] Index Page with Interactive Queue Icons
        rows = get_rows(conn, "SELECT * FROM Queue_preview")
        lastrun = "Latest Run: " + date_time
        body6 = (
            '<div id="intro" class="bg-image shadow-2-strong"><div class="container-fluid">'
            '<h2 style="text-align:center;">ENDLESS ENORMOUS PLAYLIST MANAGEMENT SYSTEM</h2>'
            '<h3>Enormous Queue - 50 Upcoming Tunes</h3>'
            f'<h5><i>{lastrun}</i></h5>'
        )
        html_index = main_head + body6
        indurilist, indnamelist, indpiclist, indaudlist = [], [], [], []
        for row in rows:
            indurilist.append(str(row[0]))
            indnamelist.append(str(row[1]))
            indpiclist.append(str(row[2]))
            indaudlist.append(str(row[3]))
        indexpage = ""
        indrow = 0
        inditemcount = 0
        while indrow < 5:
            indexpage += '<div class="row mb-1">'
            indrowitem = 0
            while indrowitem < 10:
                indrowcount = indrowitem + inditemcount
                if indrowcount >= len(indnamelist):
                    break
                indexpage += (
                    f'<div class="col-sm" title="{html.escape(indnamelist[indrowcount])}">'
                    f'<img src="{html.escape(indpiclist[indrowcount])}" width="100" height="100" class="rounded mb-1" alt="Image2">'
                    f'<audio controls><source src="{html.escape(indaudlist[indrowcount])}"></audio></div>'
                )
                indrowitem += 1
            indrow += 1
            inditemcount += 10
            indexpage += '</div>'
        indend = '</div></div></div>'
        html_index += indexpage + indend
        write_html_file(file_path, "enorindex.html", html_index)

    except sqlite3.Error as e:
        print("Database error:", e)
    finally:
        if conn:
            conn.close()
    print('Completed.')

if __name__ == "__main__":
    main()