

import datetime
import json
import song_tools
from song_tools import *
import song_writers
from song_writers import *
import DBtools
import re
from DBtools import *

from callAPI import *




def check_song(song_data, arr_data, person_data):
    """
    Parses a Planning Center arrangment, and check if it is configuree correct.
    Checks if lyrics is in place, if lyrics has the needed line shifts, if each verse element has a description
    that the sequence is configure. check number of unique verse elements towards unique sequence elements.
    Inserts/update arrangment in local database with the result from check

    :param song_data the json data object from a song request
    :param arr_data - the json data object from a arrangment request
    :param person_data - the json data object from a person request
    :return - a Json-file containing the results from the checks

    """
    MAX_LINE_LENGTH = 50
    #check bpm, length, has_chord_chart, lyrics_enabled, sequence_short, chord_chart_font_size
    #check lyrics
        #split lyrics   
        #check unique sequence elements towards song_data elements (verse refrain, chours, intro etc)
        #chcek each song element
    songcheck_result = {}
    created_by = person_data['data']['attributes']['full_name']
#    created_by = person_data['data']['attributes']['full_name']
    #song_id = song['id']
    song_id = arr_data['relationships']['song']['data']['id']
    arrangement_id = arr_data['id']
    song_url = "https://services.planningcenteronline.com/songs/"+song_id+"/arrangements/" + arrangement_id
    lyrics = arr_data['attributes']['lyrics']
    verse_marker_pattern = re.compile('^(verse?|v|chorus|c|refreng|bridge|bro|prechorus|instrumental|intro|outro|vamp|breakdown|ending|interlude|tag|misc)\s*(\d*):?$',re.IGNORECASE)

    songcheck_result['all_ok'] = "True"
    songcheck_result['created_by'] = created_by
    songcheck_result['song_id'] = song_id
    songcheck_result['song_title'] = song_data['attributes']['title']
    arrangment_name_to_check = arr_data['attributes']['name']
    songcheck_result['arrangement_name'] = re.sub(r'[\x00-\x1f\x7f-\x9f\u2028\u2029\u0022]', lambda x: '\\u{:04x}'.format(ord(x.group(0))), arrangment_name_to_check)
    #need to remove none approved JSON characters from arrangment_name
    songcheck_result['created_at'] = arr_data['attributes']['created_at']
    songcheck_result['arrangement_id'] = arrangement_id
    songcheck_result['song_url'] = song_url
    songcheck_result['verse_start'] = ""
    songcheck_result['uniqe_verse_elements']  =""
    songcheck_result['line_length'] = ""
    songcheck_result['sequence_ok'] = "False"
    songcheck_result['lyrics_enabled'] = "False"

    if (lyrics is not None):
        songcheck_result['has_lyrics']  = "OK"
        lyrics_elements = lyrics.split("\n\n")
        sequence = arr_data['attributes']['sequence_short']

        if (arr_data['attributes']['lyrics_enabled'] == 'true'):
             songcheck_result['lyrics_enabled']  = "OK"
        
        if (len(sequence)>0):  
            songcheck_result['sequence_ok'] = "OK"
        

        uniq_sequence = list(set(sequence))
        songcheck_result['uniqe_verse_elements'] = "OK. Antall sekvenslement: " + str(len(uniq_sequence)) + " Antall verselement: " + str(len(lyrics_elements))
        
        if(len(lyrics_elements)>len(uniq_sequence)):
            songcheck_result['uniqe_verse_elements'] = "Advarsel. Sjekk av antall sekvenselementer(sequence) og antall sangelementer (vers, ref, intro osv) stemmer ikke. Sjekk sangoppsettet.<br>Antall unike sekvenselement: " + str(len(uniq_sequence)) + " Antall verselement: " + str(len(lyrics_elements))
            #songcheck_result['all_ok'] = "False"

      
        verse_check_elements = []
        if(len(lyrics_elements) ==0 ):
            verse_check_elements.append("")
        
        for element in lyrics_elements:
            lines = element.split("\n")
            first_line = lines[0]
            
            if(verse_marker_pattern.search(first_line)):
                songcheck_result['verse_start']  = "OK"
                verse_check_elements.append(first_line + "-> OK")
                #print(first_line[0] + "-> OK" ) 
            else:
                songcheck_result['verse_start']  = "error"
                verse_check_elements.append(first_line + "-> error")
                #print ('Verse setup error')
                songcheck_result['all_ok'] = "False"

            for line in lines:
                songcheck_result['line_length']  = "OK"
                if(len(line)>MAX_LINE_LENGTH):
                    songcheck_result['line_length']  = "Warning - Lines is to long. Is -> " + str(len(line))
                    #songcheck_result['all_ok'] = "False"

        songcheck_result['verse_result'] = verse_check_elements 

    else:
        songcheck_result['has_lyrics']  = "Missing lyrics"
        songcheck_result['verse_result'] = ["error with verse"]
        songcheck_result['all_ok'] = "False"

    #songcheck_result_json = json.dumps(songcheck_result, indent=4)
    #print (songcheck_result)
    insertData(songcheck_result)
    return songcheck_result


def check_all_songs_in_PC():
    """
    Function to be called by schedluer.
    Runs through all songs in Planning Center and runs a check_song on all songs with arrangment
    """
    ##start
    response = request_endpoint(api_endpoint_start_from)
    more = True
    index = 0
    #check_all_song_result = []

    while(response.status_code == 200 and more):
        data = response.json()
        array = data['data']
        for song in array:
            index = index + 1
            print ( str(index) + " - id: " + song['id'] + " song title - " + song['attributes']['title'])
            arrengments_endpoint = "https://api.planningcenteronline.com/services/v2/songs/" + song['id'] + "/arrangements"
            request = request_endpoint(arrengments_endpoint)
            arrangments_data = request.json()

            for arr in arrangments_data['data']:
                person_endpoint = "https://api.planningcenteronline.com/services/v2/people/" + arr['relationships']['created_by']['data']['id']
                person_data = request_endpoint(person_endpoint).json()
                check_song(song, arr, person_data)

        if('next' in (response.json())['links']):
            response =  request_endpoint(data["links"]['next'])
        else:
            more = False
