#if defined(macintosh)
#include <types.h>
#else
#include <sys/types.h>
#include <sys/time.h>
#endif
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include "merc.h"
#include "music.h"
#include "recycle.h"

struct song_data song_table[MAX_SONGS];

void do_band_name args ( ( CHAR_DATA * ch, char *argument ) );
void do_song_name args ( ( CHAR_DATA * ch, char *argument ) );
void do_lyrics args ( ( CHAR_DATA * ch, char *argument ) );
void do_save_music args ( ( void ) );

CH_CMD ( do_msedit )
{
    sh_int count = 0;
    int lines;
    char arg[MAX_INPUT_LENGTH];
    char edit_name[MAX_INPUT_LENGTH];
    char buf[MAX_STRING_LENGTH];

    argument = one_argument ( argument, arg );
    strcpy ( edit_name, argument );

    if ( ch->pcdata->security < 9 )
    {
        send_to_char ( "You don't have enough security to edit songs.\n\r",
                       ch );
        return;
    }
    if ( arg[0] == '\0' )
    {
        send_to_char
            ( "MSEdit Syntax:\n\rMSEdit Create <song name>\n\rMSEdit Load <song name>\n\rMSEDIT Songname <song name>\n\rMSEDIT Group <group name>\n\rMSEdit Lyrics + <line>\n\rMSEdit Show\n\rMSEdit Save\n\r",
              ch );
        return;
    }

    if ( !str_cmp ( arg, "create" ) )
    {
        if ( edit_name[0] == '\0' )
        {
            send_to_char ( "You must include a song name.\n\r", ch );
            return;
        }
        if ( ch->song_ed_number > 0 )
        {
            send_to_char
                ( "Finish the song you are working on then create a new one.\n\r",
                  ch );
            return;
        }
        for ( count = 0; count < MAX_SONGS; count++ )
        {
            if ( song_table[count].name != NULL &&
                 is_name ( edit_name, song_table[count].name ) )
            {
                send_to_char
                    ( "That song already exists, try a new name.\n\r", ch );
                return;
            }
            if ( song_table[count].name == NULL )
            {
                ch->song_ed_number = count;
                ch->llines = 0;
                song_table[ch->song_ed_number].name = str_dup ( edit_name );
                song_table[ch->song_ed_number].group =
                    str_dup ( "Place Band Name here" );
                send_to_char ( "Ok.\n\r", ch );
                return;
            }
        }
    }

    if ( !str_cmp ( arg, "songname" ) )
    {
        if ( ch->song_ed_number == 0 )
        {
            send_to_char ( "you aren't currently editing any music.\n\r",
                           ch );
            return;
        }
        do_song_name ( ch, edit_name );
        return;
    }

    if ( !str_cmp ( arg, "lines" ) )
    {
        if ( is_number ( edit_name ) )
        {
            if ( atoi ( edit_name ) < 0 || atoi ( edit_name ) > MAX_LINES )
            {
                sprintf ( buf,
                          "Value must be between 0 and %d.\n\rIf you play the song and get (null) reduce the number of lines./n/r",
                          MAX_LINES );
                send_to_char ( buf, ch );
                return;
            }
            ch->llines = atoi ( edit_name );
            send_to_char ( "Ok.\n\r", ch );
            return;
        }
        else
        {
            send_to_char ( "Must be a Numeric value.\n\r", ch );
            return;
        }

    }

    if ( !str_cmp ( arg, "group" ) )
    {
        if ( ch->song_ed_number == 0 )
        {
            send_to_char ( "you aren't currently editing any music.\n\r",
                           ch );
            return;
        }
        do_band_name ( ch, edit_name );
        return;
    }

    if ( !str_cmp ( arg, "lyrics" ) )
    {
        if ( ch->song_ed_number == 0 )
        {
            send_to_char ( "you aren't currently editing any music.\n\r",
                           ch );
            return;
        }
        do_lyrics ( ch, edit_name );
        return;
    }

    if ( !str_cmp ( arg, "show" ) )
    {
        if ( ch->song_ed_number == 0 )
        {
            send_to_char ( "you aren't currently editing any music.\n\r",
                           ch );
            return;
        }
        sprintf ( buf,
                  "-=-=-=-=-=-=-=-=-=-= %s -=-=-=-=-=-=-=-=-=-=\n\r"
                  "Sung by: %s\n\r", song_table[ch->song_ed_number].name,
                  song_table[ch->song_ed_number].group );
        send_to_char ( buf, ch );
        send_to_char ( "Lyrics:\n\r", ch );
        for ( lines = 0; lines < MAX_LINES; lines++ )
        {
            if ( song_table[ch->song_ed_number].lyrics[lines] == NULL )
                break;
            sprintf ( buf, "%s\n\r",
                      song_table[ch->song_ed_number].lyrics[lines] );
            send_to_char ( buf, ch );
        }
        return;
    }

    if ( !str_cmp ( arg, "done" ) )
    {
        ch->song_ed_number = 0;
        ch->llines = 0;
        for ( lines = 0; lines < MAX_LINES; lines++ )
        {
            if ( song_table[ch->song_ed_number].lyrics[lines] == NULL )
            {
                song_table[ch->song_ed_number].lines = lines;
                break;
            }
        }
        send_to_char ( "Ok.\n\r", ch );
        return;
    }

    if ( !str_cmp ( arg, "save" ) )
    {
        send_to_char ( "Music files saved.\n\r", ch );
        do_save_music (  );
        return;
    }
    if ( !str_cmp ( arg, "load" ) )
    {
        for ( count = 0; count < MAX_SONGS; count++ )
        {
            if ( is_name ( edit_name, song_table[count].name ) )
            {
                ch->song_ed_number = count;
                sprintf ( buf, "Now editing existing file: %s\n\r",
                          song_table[ch->song_ed_number].name );
                send_to_char ( buf, ch );

                for ( lines = 0; lines < MAX_LINES; lines++ )
                {
                    if ( song_table[count].lyrics[lines] == NULL )
                        break;

                    song_table[ch->song_ed_number].lines = lines;
                    ch->llines = lines;
                    return;
                }
            }
        }
        if ( ch->song_ed_number <= 0 )
            send_to_char ( "No such Song.\n\r", ch );
    }
    send_to_char
        ( "MSEdit Syntax:\n\rMSEdit Create <song name>\n\rMSEdit Load <song name>\n\rMSEDIT Songname <song name>\n\rMSEDIT Group <group name>\n\rMSEdit Lyrics + <line>\n\rMSEdit Show\n\rMSEdit Save\n\r",
          ch );
    return;
}

CH_CMD ( do_band_name )
{
    char bandname[MAX_INPUT_LENGTH];
    char buf[MAX_INPUT_LENGTH];
    strcpy ( bandname, argument );

    if ( bandname[0] == '\0' )
    {
        send_to_char ( "You must include the band name.\n\r", ch );
        return;
    }
    sprintf ( buf, "%s", bandname );
    song_table[ch->song_ed_number].group = str_dup ( buf );
    send_to_char ( "Ok.\n\r", ch );
    return;
}

CH_CMD ( do_song_name )
{
    char songname[MAX_INPUT_LENGTH];
    char buf[MAX_INPUT_LENGTH];
    int count;
    strcpy ( songname, argument );

    if ( songname[0] == '\0' )
    {
        send_to_char ( "You must include the song name.\n\r", ch );
        return;
    }
    for ( count = 0; count < MAX_SONGS; count++ )
    {
        if ( is_name ( songname, song_table[count].name ) )
        {
            send_to_char ( "That song already exists, try a new name.\n\r",
                           ch );
            return;
        }
    }
    sprintf ( buf, "%s", songname );
    song_table[ch->song_ed_number].name = str_dup ( buf );
    send_to_char ( "Ok.\n\r", ch );
    return;
}

CH_CMD ( do_lyrics )
{
    char arg[MAX_INPUT_LENGTH];
    char lyrics[MAX_INPUT_LENGTH];
    char buf[MAX_INPUT_LENGTH];
    argument = one_argument ( argument, arg );
    strcpy ( lyrics, argument );

    if ( arg[0] == '\0' )
    {
        send_to_char ( "Type MSEdit + <string> or MSEdit -\n\r", ch );
        return;
    }

    if ( !str_cmp ( arg, "+" ) )
    {
        if ( arg[0] == '\0' )
        {
            send_to_char ( "No Blank Lines.\n\r", ch );
            return;
        }
        sprintf ( buf, "%s", lyrics );
        song_table[ch->song_ed_number].lyrics[ch->llines] = str_dup ( buf );
        ch->llines += 1;
        song_table[ch->song_ed_number].lines = ch->llines;
        send_to_char ( "Ok.\n\r", ch );
        return;
    }
    if ( !str_cmp ( arg, "-" ) )
    {
        ch->llines -= 1;
        if ( ch->llines < 0 )
        {
            send_to_char ( "Lyrics Cleared.\n\r", ch );
            ch->llines = 0;
            return;
        }
        song_table[ch->song_ed_number].lyrics[ch->llines] = str_dup ( " " );
        song_table[ch->song_ed_number].lines = ch->llines;
        send_to_char ( "Line Deleted.\n\r", ch );
        return;
    }
    send_to_char ( "Type MSEdit + <string> or MSEdit -\n\r", ch );
    return;
}

void do_save_music ( void )
{
    FILE *fp;
    int count;
    int lines;
    lines = 0;

    if ( !( fp = file_open ( "music.txt", "w" ) ) )
    {
        bug ( "Open_help: fopen", 0 );

        perror ( "music.txt" );
    }
    for ( count = 0; count < MAX_SONGS; count++ )
    {
        if ( song_table[count].name == NULL )
            break;

        fprintf ( fp, "%s~\n%s~\n", song_table[count].group,
                  song_table[count].name );

        for ( lines = 0; count < MAX_LINES; lines++ )
        {
            if ( song_table[count].lyrics[lines] == NULL )
            {
                fprintf ( fp, "~\n" );
                break;
            }
            fprintf ( fp, "%s\n", song_table[count].lyrics[lines] );
        }
    }
    fprintf ( fp, "#\n" );
    file_close ( fp );
    return;
}