#!/bin/bash

# =================================
# ASETUKSET JA HAKEMISTOT
# =================================
BASE_DIR="$HOME/funkRadio"
TALK_DIR="$BASE_DIR/talk"
PLAYLIST_DIR="$BASE_DIR/playlists"
LOG_FILE="$BASE_DIR/logs/newsyRadio.log"
LOG_DIR="$BASE_DIR/logs"
MUSIC_LOG="$BASE_DIR/logs/musicRadio.log"
ERROR_LOG_FILE="$BASE_DIR/logs/errorRadio.log"

# Varmistetaan hakemistot
mkdir -p "$TALK_DIR" "$PLAYLIST_DIR" "$(dirname "$LOG_FILE")"

# Tarkistetaan riippuvuudet
for cmd in mpg123 curl wget ffmpeg yt-dlp mp3gain bc; do
    if ! command -v $cmd &> /dev/null; then
        echo "Virhe: Komentoa '$cmd' ei löydy. Asenna se ensin."
        exit 1
    fi
done

# =================================
# LATAUSFUNKTIOT (YLE & BBC)
# =================================

yle_downloads() {
    rss_content=$(curl -sL "$yle_region_rss")
    addr2=$(echo "$rss_content" | grep -o 'url="[^"]*"' | head -1 | sed 's/url="//;s/"//')

    if [ -z "$addr2" ]; then return 1; fi

    basename_raw=$(basename "$addr2")
    file_id_of_new_podcast=$(echo "$basename_raw" | sed 's/^[^-]*-//;s/\.mp3.*//')

    if [ -z "$file_id_of_new_podcast" ]; then return 1; fi

    # Tarkistetaan lokista
    if grep -Fq "$file_id_of_new_podcast" "$LOG_FILE"; then return 0; fi

    # Siivotaan vanhat
    find "$TALK_DIR" -type f -name "*$yle_region*" -delete

    temp_file="$TALK_DIR/${yle_region}_raw.mp3"
    final_file="$TALK_DIR/${yle_region}.mp3"

    wget -q -O "$temp_file" "$addr2"

    if [ ! -s "$temp_file" ]; then rm -f "$temp_file"; return 1; fi

    duration=$(ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 "$temp_file")
    cut_start=10.6
    cut_end=6.5
    new_duration=$(echo "$duration - $cut_start - $cut_end" | LC_NUMERIC=C bc -l)
    is_valid=$(echo "$new_duration > 0" | LC_NUMERIC=C bc -l)

    if [ "$is_valid" -eq 1 ]; then
        ffmpeg -v error -y -ss "$cut_start" -i "$temp_file" -t "$new_duration" -acodec copy "$final_file"
        if [ $? -eq 0 ]; then
            rm -f "$temp_file"
            mp3gain -g +0 "$final_file" > /dev/null 2>&1
            echo "$yle_region.mp3 | ID:$file_id_of_new_podcast | $(date +%F_%T)" >> "$LOG_FILE"
        else
            rm -f "$temp_file"
        fi
    else
        rm -f "$temp_file"
    fi
}

bbcworldnews() {
    local OUTFILE="$TALK_DIR/BBCworldnews.mp3"
    local URL="https://www.bbc.co.uk/programmes/p002vsmz/episodes/player"
    local ID_TAG="bbc_modtime"

    # Ladataan tiedosto (yt-dlp asettaa mtime:n)
    if ! yt-dlp --playlist-items 1 -f bestaudio --extract-audio --audio-format mp3 --audio-quality 0 --no-warnings --quiet -o "$OUTFILE" "$URL"; then
        return 1
    fi

    file_mtime=$(stat -c %Y "$OUTFILE")

    if grep -q "$ID_TAG:$file_mtime" "$LOG_FILE"; then
        # Ei uutta päivitystä, mutta tiedosto on jo levyllä. Ei tehdä mitään.
        :
    else
        mp3gain -g +4 "$OUTFILE" > /dev/null 2>&1
        echo "BBCworldnews.mp3 | $ID_TAG:$file_mtime | $(date +%F_%T)" >> "$LOG_FILE"
    fi
}

yleppohjanmaa() {
    yle_region="YLEppohjanmaa"
    yle_region_rss="https://feeds.yle.fi/areena/v1/series/1-4479456.rss"
    yle_downloads
}

ylepsavo() {
    yle_region="YLEpsavo"
    yle_region_rss="https://feeds.yle.fi/areena/v1/series/1-4479312.rss"
    yle_downloads
}

yleradiosuomi() {
    yle_region="YLEfinland"
    yle_region_rss="https://feeds.yle.fi/areena/v1/series/1-1440981.rss"
    yle_downloads
}

yleuusimaa() {
    yle_region="YLEuusimaa"
    yle_region_rss="https://feeds.yle.fi/areena/v1/series/1-2595371.rss"
    yle_downloads
}


# =================================
# MUUT KANSAINVÄLISET LATAUSFUNKTIOT
# =================================

dlf() {
    NOW=$(date +%F_%T)
    log_step() {
        local step="$1"
        local status="$2"
        echo "[$NOW] $step: $status" >> "$ERROR_LOG_FILE"
    }

    log_step "START_DLF" "OK"

    # --- Luetaan vanha muokkausaika ---
    modtime_of_old_podcast=$(grep "Dlf_nachrichten.mp3" "$LOG_FILE" | tail -1 | awk '{print $2}')
    if [ -z "$modtime_of_old_podcast" ]; then
        modtime_of_old_podcast=0
        log_step "READ_OLD_MODTIME" "EI_AIEMPAA_MERKINTAA"
    else
        log_step "READ_OLD_MODTIME" "LOYTYI $modtime_of_old_podcast"
    fi

    # --- Haetaan uusi Last-Modified-otsake ---
    last_modified_header=$(curl -sI "http://ondemand-mp3.dradio.de/file/dradio/nachrichten/nachrichten.mp3" \
        | grep -i "Last-Modified:" | cut -d' ' -f2-)

    if [ -z "$last_modified_header" ]; then
        log_step "FETCH_LAST_MODIFIED" "VIRHE (otsake puuttuu)"
        exit 1
    fi

    modtime_of_new_podcast=$(date -d "$last_modified_header" +"%Y%m%d%H%M%S" 2>/dev/null)

    if [ -z "$modtime_of_new_podcast" ]; then
        log_step "PARSE_LAST_MODIFIED" "VIRHE (päivämäärän muunnos)"
        exit 1
    fi

    log_step "FETCH_LAST_MODIFIED" "OK ($modtime_of_new_podcast)"

    # --- Verrataan aikaleimoja ---
    if [ "$modtime_of_new_podcast" -le "$modtime_of_old_podcast" ]; then
        log_step "COMPARE_MODTIMES" "EI_PAIVITYSTARVETTA"
        exit 0
    fi

    log_step "COMPARE_MODTIMES" "UUSI_TIEDOSTO_SAATAVILLA"

    # --- Ladataan uusi tiedosto ---
    if wget -q -O "$TALK_DIR/Dlf_nachrichten1.mp3" \
        "http://ondemand-mp3.dradio.de/file/dradio/nachrichten/nachrichten.mp3"; then
        log_step "DOWNLOAD_FILE" "OK"
    else
        log_step "DOWNLOAD_FILE" "VIRHE"
        exit 1
    fi

    # --- Päivitetään lokitiedosto ---
    echo "Dlf_nachrichten.mp3 $modtime_of_new_podcast" >> "$LOG_FILE"
    log_step "UPDATE_LOG_FILE" "OK"

    # --- Käsitellään ääni ---
    if [ -f "$TALK_DIR/Dlf_nachrichten1.mp3" ]; then
        duration=$(ffprobe -v error -show_entries format=duration \
            -of default=noprint_wrappers=1:nokey=1 "$TALK_DIR/Dlf_nachrichten1.mp3")

        if [ -n "$duration" ]; then
            # Leikataan alusta 3.9s ja lopusta 9.0s
            trimmed=$(echo "$duration - 9.0 - 3.9" | bc -l | awk '{printf("%.1f",$1)}')
            trimmed=${trimmed//,/.}

            if ffmpeg -v error -y -ss 3.9 -i "$TALK_DIR/Dlf_nachrichten1.mp3" \
                -t "$trimmed" "$TALK_DIR/Dlf_nachrichten.mp3" >/dev/null 2>&1; then
                log_step "FFMPEG_TRIM" "OK"
            else
                log_step "FFMPEG_TRIM" "VIRHE"
            fi

            if mp3gain -g +2 "$TALK_DIR/Dlf_nachrichten.mp3" >/dev/null 2>&1; then
                log_step "MP3GAIN" "OK"
            else
                log_step "MP3GAIN" "VIRHE"
            fi
        else
            log_step "READ_DURATION" "VIRHE (ei numeerinen)"
        fi

        rm -f "$TALK_DIR/Dlf_nachrichten1.mp3"
        log_step "CLEANUP" "OK"
    fi

    log_step "END_DLF" "OK"
    exit 0
}

npr() {
    NOW=$(date +%F_%T)
    log_step() {
        local step="$1"
        local status="$2"
        echo "[$NOW] $step: $status" >> "$ERROR_LOG_FILE"
    }

    log_step "START_NPR" "OK"

    # --- Luetaan vanha muokkausaika ---
    modtime_old=$(grep "Npr_newscast.mp3" "$LOG_FILE" | tail -1 | awk '{print $2}')
    if [ -z "$modtime_old" ]; then
        modtime_old=0
        log_step "READ_OLD_MODTIME" "EI_AIEMPAA_MERKINTAA"
    else
        log_step "READ_OLD_MODTIME" "LOYTYI $modtime_old"
    fi

    # --- Haetaan Last-Modified-otsake ---
    header_info=$(curl -sI http://pd.npr.org/anon.npr-mp3/npr/news/newscast.mp3)
    if [ -z "$header_info" ]; then
        log_step "FETCH_HEADER" "VIRHE (tyhjä vastaus)"
        exit 1
    fi

    last_modified_header=$(echo "$header_info" | grep -i "Last-Modified:" | cut -d' ' -f2-)
    if [ -z "$last_modified_header" ]; then
        log_step "PARSE_HEADER" "VIRHE (Last-Modified puuttuu)"
        exit 1
    fi

    modtime_new=$(date -d "$last_modified_header" +"%Y%m%d%H%M%S" 2>/dev/null)
    if [ -z "$modtime_new" ]; then
        log_step "PARSE_LAST_MODIFIED" "VIRHE (päivämäärän muunnos)"
        exit 1
    fi

    log_step "FETCH_LAST_MODIFIED" "OK ($modtime_new)"

    # --- Verrataan aikaleimoja ---
    if [ "$modtime_new" -le "$modtime_old" ]; then
        log_step "COMPARE_MODTIMES" "EI_PAIVITYSTARVETTA"
        exit 0
    fi

    log_step "COMPARE_MODTIMES" "UUSI_TIEDOSTO_SAATAVILLA"

    # --- Poistetaan vanhat NPR-tiedostot ---
    find "$TALK_DIR" -type f -name "Npr_newscast*.mp3" -delete
    log_step "CLEAN_OLD_FILES" "OK"

    # --- Ladataan uusi tiedosto ---
    if wget -q -O "$TALK_DIR/Npr_newscast.mp3" \
        "http://pd.npr.org/anon.npr-mp3/npr/news/newscast.mp3"; then
        log_step "DOWNLOAD_FILE" "OK"
    else
        log_step "DOWNLOAD_FILE" "VIRHE"
        exit 1
    fi

    # --- Normalisoidaan ääni ---
    if mp3gain -g 0 "$TALK_DIR/Npr_newscast.mp3" >/dev/null 2>&1; then
        log_step "MP3GAIN" "OK"
    else
        log_step "MP3GAIN" "VIRHE"
    fi

    # --- Päivitetään lokitiedosto ---
    echo "Npr_newscast.mp3 $modtime_new" >> "$LOG_FILE"
    log_step "UPDATE_LOG_FILE" "OK"

    log_step "END_NPR" "OK"
    exit 0
}

sverigesradio() {
    RSS_URL="https://api.sr.se/api/rss/pod/3795"
    OUTPUT_FILE="$TALK_DIR/Sr_nyheter.mp3"
    NOW=$(date +%F_%T)

    log_step() {
        echo "[$NOW] $1: $2" >> "$ERROR_LOG_FILE"
    }

    log_step "START_SVERIGESRADIO" "OK"

    # ---------------------------------------------------------
    # Luetaan edellinen aikaleima
    # ---------------------------------------------------------
    modtime_old=$(grep "Sr_nyheter.mp3" "$LOG_FILE" | tail -1 | awk '{print $2}')

    if [ -z "$modtime_old" ]; then
        modtime_old=0
        log_step "READ_OLD_MODTIME" "EI_AIEMPAA_MERKINTAA"
    else
        log_step "READ_OLD_MODTIME" "LOYTYI $modtime_old"
    fi

    # ---------------------------------------------------------
    # Haetaan RSS-syöte
    # ---------------------------------------------------------
    rss_stream=$(wget -q -O - "$RSS_URL" | head -c 50000)

    if [ -z "$rss_stream" ]; then
        log_step "FETCH_RSS" "VIRHE (tyhjä syöte)"
        exit 1
    fi

    log_step "FETCH_RSS" "OK"

    # ---------------------------------------------------------
    # Erotetaan MP3-osoite
    # ---------------------------------------------------------
    pod_file=$(echo "$rss_stream" | grep -oP '(?<=url=").*(?=" length)' | head -1)

    if [ -z "$pod_file" ]; then
        log_step "PARSE_RSS" "VIRHE (ei MP3-osoitetta)"
        exit 1
    fi

    log_step "PARSE_RSS" "OK ($pod_file)"

    # ---------------------------------------------------------
    # Erotetaan julkaisupäivä (pubDate)
    # ---------------------------------------------------------
    pubdate=$(echo "$rss_stream" | grep -oP '(?<=<pubDate>).*?(?=</pubDate>)' | head -1)

    if [ -z "$pubdate" ]; then
        log_step "PARSE_PUBDATE" "VIRHE (ei julkaisupäivää)"
        exit 1
    fi

    log_step "PARSE_PUBDATE" "OK ($pubdate)"

    # Muunnetaan julkaisupäivä numeeriseksi aikaleimaksi
    modtime_new=$(date -d "$pubdate" +"%Y%m%d%H%M%S" 2>/dev/null)

    if [ -z "$modtime_new" ]; then
        log_step "PARSE_PUBDATE" "VIRHE (päivämäärän muunnos)"
        exit 1
    fi

    log_step "PARSE_PUBDATE_CONVERT" "OK ($modtime_new)"

    # ---------------------------------------------------------
    # Verrataan aikaleimoja
    # ---------------------------------------------------------
    if [ "$modtime_new" -le "$modtime_old" ]; then
        log_step "COMPARE_MODTIMES" "EI_PAIVITYSTARVETTA"
        exit 0
    fi

    log_step "COMPARE_MODTIMES" "UUSI_TIEDOSTO_SAATAVILLA"

    # ---------------------------------------------------------
    # Ladataan uusi MP3
    # ---------------------------------------------------------
    if wget -q -O "$OUTPUT_FILE" "$pod_file"; then
        log_step "DOWNLOAD_FILE" "OK"
    else
        log_step "DOWNLOAD_FILE" "VIRHE"
        exit 1
    fi

    # ---------------------------------------------------------
    # Normalisoidaan ääni
    # ---------------------------------------------------------
    if mp3gain -g +1 "$OUTPUT_FILE" >/dev/null 2>&1; then
        log_step "MP3GAIN" "OK"
    else
        log_step "MP3GAIN" "VIRHE"
    fi

    # ---------------------------------------------------------
    # Päivitetään lokitiedosto
    # ---------------------------------------------------------
    echo "Sr_nyheter.mp3 $modtime_new" >> "$LOG_FILE"
    log_step "UPDATE_LOG_FILE" "OK"
    log_step "END_SVERIGESRADIO" "OK"

    exit 0
}


# =================================
# SOITTO- JA HALLINTAFUNKTIOT
# =================================

play_random_song() {
    # Jos soittolistaa ei ole valittu, etsitään ensimmäinen m3u-tiedosto
    if [ -z "$Playlist" ] || [ ! -f "$Playlist" ]; then
         Playlist=$(find "$PLAYLIST_DIR" -maxdepth 1 -name "*.m3u" | head -n 1)
    fi

    if [ -n "$Playlist" ]; then
        # Valitaan satunnainen rivi (kappale) soittolistalta
        # shuf -n 1 valitsee yhden rivin satunnaisesti
        random_song="$(shuf -n 1 "${Playlist}")"

        if [ -n "$random_song" ]; then
            echo "---------------------------------------------------"
            # echo "Soitetaan musiikkia: $(basename "$random_song")"
            echo "Soitetaan musiikkia: $random_song"
            echo "---------------------------------------------------"
            echo "${random_song} | $(date +%F_%T)" >> "$MUSIC_LOG"

            # mpg123 -C mahdollistaa näppäinkomennot (esim. 'q' lopettaa kappaleen)
            mpg123 -q -C "${random_song}"
        else
            echo "Virhe: Soittolista on tyhjä tai riviä ei voitu lukea."
            sleep 2
        fi
    else
        echo "Varoitus: Soittolistaa ei löytynyt hakemistosta $PLAYLIST_DIR."
        sleep 2
    fi
}

download_news() {
    echo "==================================================="
    echo "Kansio tyhjä. Tarkistetaan uudet uutiset..."
    echo "Lataus käynnissä taustalla, soitetaan musiikkia..."
    echo "==================================================="

    # Käynnistetään lataukset taustalla (&)
    ( yleppohjanmaa ) &
    ( ylepsavo ) &
    ( yleradiosuomi ) &
    ( yleuusimaa ) &
    ( bbcworldnews ) &
    ( dlf ) &
    ( npr ) &
    ( sverigesradio ) &

    # Tallennetaan taustaprosessien ID:t, jos haluamme odottaa niitä
    # Tässä tapauksessa soitamme yhden kappaleen latauksen aikana.

    play_random_song

    # Odotetaan, että kaikki taustalataukset ovat valmiita ennen uutisluupin jatkamista
    wait

    echo "Lataukset valmiit. Jatketaan uutisiin."
    listen_to_the_radio
}

listen_to_the_radio() {
    # Siirrytään skriptin hakemistoon (varotoimenpide)
    cd "$(dirname "$0")" || exit

    # Tarkistetaan ajastin
    if [ "$timer_on" = "Yes" ]; then
      val1=$(date --date="$timer_limit" +%s)
      val2=$(date +%s)
      if [ $val1 -le $val2 ]; then
        echo "Ajastin: Aika loppui. Suljetaan."
        exit 0
      fi
    fi

    # Etsitään mp3-tiedostot uutiskansiosta
    declare -a array_of_news
    # Käytetään findia ja luetaan taulukkoon. Järjestys on satunnainen tai aakkosellinen.
    IFS=$'\n' read -r -d '' -a array_of_news < <( find "$TALK_DIR" -maxdepth 1 -name "*.mp3" | sort && printf '\0' )

    if [ ${#array_of_news[@]} -eq 0 ]; then
        # Jos uutisia ei ole, ladataan niitä (ja soitetaan musiikkia odotellessa)
        download_news
    else
        # Otetaan listan ensimmäinen uutinen
        news_item="${array_of_news[0]}"

        echo "---------------------------------------------------"
        echo "Soitetaan uutinen: $(basename "$news_item")"
        echo "---------------------------------------------------"

        mpg123 -C "${news_item}"

        # Poistetaan uutinen kuuntelun jälkeen
        rm "${news_item}"

        sleep 1

        # Soitetaan musiikkia uutisten välissä, jos ei ole estetty
        if [[ "$skip_music" = "No" ]]; then
            play_random_song
        else
            sleep 1
        fi

        # Palataan alkuun (soitetaan seuraava uutinen tai ladataan lisää)
        listen_to_the_radio
    fi
}

control_panel() {
    while true; do
        clear
        echo "=== FUNK RADIO CONTROL ==="
        if [ -s "${Playlist}" ]; then
          echo "Soittolista: $(basename "${Playlist}") ($(wc -l < "${Playlist}") kappaletta)"
        else
          echo "Soittolista: Tyhjä tai ei valittu."
        fi

        if [ "$timer_on" = "Yes" ]; then
            echo "Ajastin asetettu: $timer_limit_readable"
        fi
        echo "--------------------------"
        echo "1. Aseta ajastin (sammutus)"
        echo "2. Soita (Uutiset + Musiikki vuorotellen)"
        echo "3. Soita (Vain uutiset, musiikkia vain latauksen aikana)"
        echo "4. Lopeta"
        echo "--------------------------"
        echo -n "Valinta: "

        read -r choice
        case "$choice" in
          "1")
              echo -n "Anna minuutit: "
              read -r t
              # Tarkistetaan onko syöte numero
              if [[ "$t" =~ ^[0-9]+$ ]]; then
                  timer_limit=$(date -d "+${t} minutes" --iso-8601=seconds)
                  timer_limit_readable="$(date -d "$timer_limit" +'%H:%M:%S')"
                  timer_on="Yes"
              else
                  echo "Virheellinen aika."
                  sleep 1
                  timer_on="No"
              fi
              ;;
          "2")
              skip_music="No"
              listen_to_the_radio
              ;;
          "3")
              skip_music="Yes"
              listen_to_the_radio
              exit
              ;;
          "4")
              exit
              ;;
          *)
              echo "Virheellinen valinta."
              sleep 1
              ;;
        esac
    done
}

# =================================
# PÄÄOHJELMAN ALUSTUS
# =================================
clear

# Poistetaan vanhimmat merkinnät, jos lokin koko yli 100 riviä.
# ### KORJAUS: Vaihdettu silmukan muuttuja nimeksi 'target_log', jotta se ei ylikirjoita
# globaalia LOG_FILE-muuttujaa.
for target_log in "$LOG_DIR"/*.log; do
    # Varmista että tiedosto on olemassa (ettei *.log laajennu itseensä)
    [ -e "$target_log" ] || continue

    LINE_COUNT=$(wc -l < "$target_log")

    if [ "$LINE_COUNT" -gt 100 ]; then
        sed -i '1,10d' "$target_log"
        # echo "Siivottu: $target_log (poistettu 10 riviä)"
    fi
done


# Kysytään, halutaanko vanhat uutiset poistaa
count=$(find "$TALK_DIR" -type f -name "*.mp3" | wc -l)
if [ "$count" -gt 0 ]; then
    echo "Kansiosta löytyi $count lataamatonta/kuuntelematonta uutista."
    echo -n "Paina Enter poistaaksesi ne (aloita puhtaalta pöydältä) tai kirjoita 'k' säästääksesi: "
    read -r del
    if [ -z "$del" ]; then
        find "$TALK_DIR" -type f -name "*.mp3" -delete
        echo "Vanhat uutiset poistettu."
    else
        echo "Vanhat uutiset säästetty."
    fi
fi

# Soittolistan valinta
# Etsitään .m3u tiedostoja playlist-kansiosta
declare -a lists
IFS=$'\n' read -r -d '' -a lists < <( find "$PLAYLIST_DIR" -maxdepth 1 -name "*.m3u" && printf '\0' )

if [ ${#lists[@]} -gt 0 ]; then
  echo ""
  PS3='Valitse soittolista (numero): '
  select Playlist in "${lists[@]}"; do
    if [[ -n "$Playlist" ]]; then
        break
    else
        echo "Virheellinen valinta."
    fi
  done
else
  echo "Varoitus: Ei soittolistoja (.m3u) kansiossa $PLAYLIST_DIR"
  echo "Musiikkitoiminto ei toimi ennen kuin lisäät soittolistan."
  read -p "Paina Enter jatkaaksesi..."
fi

# Käynnistetään käyttöliittymä
control_panel

# ~/funkRadio/sh/newsyRadio_20.sh


