<?php

class AudioVideoHandler
{
    private $directories;

    public function __construct()
    {
        echo "[INFO] Fetching directories...";
        $this->directories = glob( DOWNLOAD_PATH . '/*', GLOB_ONLYDIR );
        echo "OK\n";
        artistChoose:
        $artist = readline( "Artist: " );
        if( $artist === 'exit' )
        {
            return;
        }

        $searchDir = DOWNLOAD_PATH . '/' . $artist;
        $searchDir = str_replace( "\\", '/', $searchDir );
        echo "[INFO] Loading results...";


        $matches = 0;
        $_indexmatch = 0;
        $_found = '';
        foreach ( $this->directories as $index => $_dir )
        {
            if ( ( $lev = levenshtein( $_dir, $searchDir ) ) < 3 )
            {
                $_found .= "$index | $_dir\n";
                $_indexmatch = $index;
                $matches++;
            }
            #echo $lev . "\n";

        }
        echo "OK\n";
        if ( $matches === 0 )
        {
            echo "[INFO] No matches found!\n";
            goto artistChoose;
        }

        indexChoose:
        if( $matches > 1 )
        {
            echo "[FOUND] $matches are found!\nIndex  |  Artist\n";
            echo $_found;
            $index = readline( "Name the index-number: " );
        }
        else
        {
            $index = $_indexmatch;
        }
        if ( isset( $this->directories[$index] ) === false )
        {
            echo "[ERROR] Index is invalid!\n";
            goto indexChoose;
        }

        $dir = $this->directories[$index];


        echo "[INFO] Scanning Artist directory...";
        $files = scandir( $dir );
        unset( $files[0], $files[1] );

        echo "OK\n";

        if ( count( $files ) < 1 )
        {
            echo "[WARNING] Directory $dir is empty!\n";
            goto artistChoose;
        }
        echo "[INFO] " . count($files) . " songs found.";
        $_titleOrFull = readline( "Do you want to download all songs or just an specific title?[A/t]: " );
        if ( stripos( $_titleOrFull, 't' ) !== false || stripos( $_titleOrFull, 'title' ) !== false )
        {
            echo "\n";
            // Only one
            songChoose:
            $song = readline( "Enter the Song name('list' to list): " );
            if( $song === 'exit' )
            {
                return;
            }
            if( $song === 'list' )
            {
                echo "Listing all Songs...\n";
                foreach( $files as $_song )
                {
                    echo "$_song\n";
                }
                goto songChoose;
            }
            echo "[INFO] Searching...\n";
            $matches = 0;
            $artist = basename( $dir );
            $_found = '';
            $_indexmatch = 0;
            foreach ( $files as $index => $name )
            {
                $name = str_replace( array( '.txt', '.mp3', '.mp4' ), '', $name );
                if ( ( $lev = levenshtein( $name, $artist . ' - ' . $song ) ) < 4 )
                {
                    $_found .= "$index | $song\n";
                    $matches++;
                    $_indexmatch = $index;
                }
            }
            if ( $matches === 0 )
            {
                echo "[WARNING] No matches found!\n";
                goto songChoose;
            }
            if( $matches > 1 )
            {
                echo "[FOUND] $matches are found!\nIndex  |  Song\n";
                echo $_found;
                $index = readline( "Name the index-number: " );
            }
            else
            {
                $index = $_indexmatch;
            }
            
            if ( isset( $files[$index] ) === false )
            {
                echo "[ERROR] Index is invalid!\n";
                goto songChoose;
            }

            $files[$index] = str_replace( array( '.txt', '.mp3', '.mp4' ), '', $files[$index] );
            $this->download( $files[$index] );

        } else
        {
            echo "\n";
            // All files
            echo "[INFO] Downloading " . count( $files ) . " songs...\n";
            foreach ( $files as $file )
            {
                if ( $file === '.' || $file === '..' || strpos( $file, '.mp3' ) !== false || strpos( $file, '.mp4' ) !== false )
                {
                    continue;
                }
                $file = str_replace( array( '.txt', '.mp3', '.mp4' ), '', $file );

                $this->download( $file );

            }
        }
    }


    private function download( $file )
    {
        echo "[INFO] Downloading $file...";
        exec( 'youtube-dl.exe --extract-audio --no-warnings -q --embed-thumbnail --audio-format mp3 --recode-video mp4 --audio-quality 4 -k -o downloaded.%(ext)s "ytsearch: ' . $file . '"' );
        echo "OK\n";
        list( $artist, $title ) = explode( ' - ', $file );
        if ( file_exists( './downloaded.f135.mp4' ) === true )
        {
            rename( "./downloaded.f135.mp4", DOWNLOAD_PATH . '/' . $artist . "/$artist - $title.mp4" );
            echo "[SUCCESS] MP4 saved!\n";
        }
        if ( file_exists( './downloaded.mp3' ) === true )
        {
            rename( "./downloaded.mp3", DOWNLOAD_PATH . '/' . $artist . "/$artist - $title.mp3" );
            echo "[SUCCESS] MP3 saved!\n";
        }

        array_map( 'unlink', glob( "./downloaded.*" ) );
    }

}