#!/usr/bin/env python3
import argparse, os, subprocess, sys

def html_body(lyrics: list) -> str:
    html_body = str();

    is_in_stanza = False;
    lines_in_stanza = 0;

    for line in lyrics:
        if not is_in_stanza:  # Open new stanza
            html_body += f'{"":>6}<p class="stanza">\n';
            is_in_stanza = True
            lines_in_stanza = 0

        if line == '\n' and lines_in_stanza > 0:  # Close stanza
            html_body += f'{"":>6}</p>\n\n'
            is_in_stanza = False
        elif line != '\n':  # Add non-blank line to stanza
            html_body += f'{"":>10}<span class="line">{line.strip()}</span>\n'
            lines_in_stanza += 1

    html_body += f'{"":>6}</p>\n\n'
    return html_body


def html_from_template(title, icon, body, url) -> str:
    return html_template_top(title, icon) \
           + body \
           + html_template_bottom(title, url);


html_template_top = lambda title, icon : """\
<!DOCTYPE html>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>""" + title + """</title>
    <link rel="shortcut icon" href=" """ + icon + """ ">
    <style>
        body {
            font-family: verdana;
            background-color: #222;
            color: #D4D4D4;
        }
        .stanza {
            margin-left: 300px;
        }
        .line {
            display: block;
            font-size: 25px;
        }
    </style>
  </head>

  <body>
"""

html_template_bottom = lambda title, url : f"""
      <p style="margin: 50px; padding-left: 250px">
          <a style="color: red; text-align: center"
             target="_blank"
             href="{url}"
             >Link to video: {str(title)}</a>
      </p>
  </body>
""" + """
  <script>
    let style = document.createElement("style");

    style.textContent= `
      #rikaikun-shadow {
        background-color: #222 !important;
        color: #D4D4D4 !important;
      }
      #rikaikun-shadow .w-kanji {
        font-size: 30px !important;
        color: #8EC07C !important;
      }
      #rikaikun-shadow .w-kana {
        font-size: 25px !important;
        color: #FABD2F !important;
      }
      #rikaikun-shadow .w-conj {
        color: #D3869B !important;
      }
      #rikaikun-shadow .w-def {
        font-size: 20px !important;
        color: #D4D4D4 !important;
      }
      body li.tod {
        font-size: 18px ;
      }
      body li.tod:first-child:nth-last-child(2) {
        font-size: 22px ;
      }
      body li.tod:nth-child(2) {
        font-size: 16px ;
      }`;

    if (!document.querySelector("#rikaichan-window")?.shadowRoot?.appendChild(style)) {
        const observer = new MutationObserver(() => {
            if (document.querySelector("#rikaichan-window")?.shadowRoot?.appendChild(style)) {
                observer.disconnect();
            }
        });
        observer.observe(document.body, {
            childList: true,
            subtree: true, // remove if the parent is a direct parent
        });
    }
  </script>
</html>
"""

if __name__ == "__main__":
    parser = argparse.ArgumentParser(description='Quickly create an html file from lyrics');
    parser.add_argument('-t', '--title', metavar='<title>', type=ascii);
    parser.add_argument('-u', '--url', metavar='<url>', type=ascii);
    parser.add_argument('-i', '--icon', metavar='<path>', type=ascii);
    parser.add_argument('-d', '--download', metavar='<url>', type=ascii,
                        help='Download mp3 from url');
    parser.add_argument('file', type=ascii, nargs='?',
                        help='Read lyrics from file');
    args = parser.parse_args();

    if args.file is not None or not sys.stdin.isatty():
        title = args.title[1:-1] if args.title is not None else '';
        url =   args.url[1:-1]   if args.url   is not None else '';
        icon =  args.icon[1:-1]  if args.icon  is not None else '';

        # Read lyrics lines
        if args.file is not None:
            lyrics_file = open(args.file[1:-1], 'r');
            lyrics = lyrics_file.readlines();
        else:
            lyrics = sys.stdin.readlines();

        body = html_body(lyrics);
        html = html_from_template(title, icon, body, url);

        sys.stdout.write(html);
        sys.exit(0);
    else:
        parser.print_help();
        sys.exit(1);