import os, sys
currentDirectory = os.path.dirname(os.path.realpath(__file__))
directoryOneLevelAbove = os.path.dirname(currentDirectory)
sys.path.append(directoryOneLevelAbove)
from helper import get_master_data_file_from_s3_as_data_frame
from helper import db_operations

def execute(schema, run_details, rule_mapping, rule):
    print('****************************************RUN DETAILS****************************************')
    print('Run Id: ', run_details.id, ', File Details Id: ', run_details.file_details_id, ', Actual File Name: ', run_details.actual_file_name, ', File Name in Received Folder: ', run_details.file_name_in_received_folder, ', File Size: ', run_details.file_size, ', Number of Rows in File: ', run_details.number_of_rows, ', Run Status: ', run_details.status_code)
    print('****************************************RULE DETAILS****************************************')
    print('Rule Id: ', rule.id, ', Rule Code: ', rule.code, ', Rule Description: ', rule.description, ', Rule to Apply on: ', rule.to_apply_on, ', Is Rule Mandatory: ', rule.is_mandatory)
    print('****************************************RULE FILE MAPPING DETAILS****************************************')
    print('Rule File Mapping Id: ', rule_mapping.id, ', Rule Id: ', rule_mapping.rule_id, ', File Details Id: ', rule_mapping.file_details_id, ', Column to Apply Rule on: ', rule_mapping.column_id)
    print('******************************************************************************************')

    #Step 1: Get the file_details_id
    file_details_id = rule_mapping.file_details_id

    result = "SUCCESS"

    #Step 2: Using the file_details_id, get the received_location_pattern, file_name_in_received_folder, sheet_name, header_row_index, data_column_span and other columns that are necessary to create the dataframe on which the rule will be executed.
    master_ingestion_raw_source_file_details = get_master_data_file_from_s3_as_data_frame.get_master_ingestion_raw_source_file_details_from_s3_with_condition(
        'id',
        file_details_id
    )
    if(len(master_ingestion_raw_source_file_details) > 0):
        row = master_ingestion_raw_source_file_details.iloc[0]
        #file_name_pattern = row.file_name_pattern
        file_name_delimiter = row.file_name_delimiter
        #schema_name = row.schema_name
        #table_name = row.table_name
        #received_location_pattern = row.received_location_pattern
        #file_extension = row.file_extension
        #sheet_name = row.sheet_name
        #header_row_index = row.header_row_index
        #data_column_span = row.data_column_span

        #Step 3: Using file_details_id, name_delimiter and actual_file_name from run_details, get the number of rows
        number_of_rows = get_number_of_rows_in_file_by_splitting_file_name(file_details_id, file_name_delimiter, run_details.actual_file_name)

        rule_execution_details = {}
        rule_execution_details["file_load_details_id"] = run_details.id
        rule_execution_details["rule_id"] = rule.id
        
        if number_of_rows > -1:
            if(number_of_rows == run_details.number_of_rows):
                rule_execution_details["status_code"] = 'S'
                rule_execution_details["status_description"] = 'Count of rows in file same as that in the file name'
                print('Count of rows in file same as that in the file name')
            else:
                rule_execution_details["status_code"] = 'F'
                rule_execution_details["status_description"] = 'Count of rows in file NOT same as that in the file name'
                print('Count of rows in file NOT same as that in the file name')
                result = 'FAILURE'
        else:
            rule_execution_details["status_code"] = 'S'
            rule_execution_details["status_description"] = 'Count of rows NOT present in file name'
            print('Count of rows NOT present in file name')
        db_operations.insert_rule_check_details_for_run(schema, rule_execution_details)
    return result

def get_number_of_rows_in_file_by_splitting_file_name(file_details_id, file_name_delimiter, actual_file_name):
    actual_file_name_without_extension = actual_file_name[:actual_file_name.rfind(".")]
    file_name_parts_array = actual_file_name_without_extension.split(file_name_delimiter)
    print('File Name Split by Delimiter: ', file_name_parts_array)
    i = 0
    master_ingestion_raw_source_file_name_details = get_master_data_file_from_s3_as_data_frame.get_master_ingestion_raw_source_file_name_details_from_s3_with_condition(
        'file_details_id', 
        file_details_id
    )
    master_ingestion_raw_source_file_name_details.sort_values('index_in_file_name')
    for row in master_ingestion_raw_source_file_name_details.itertuples():
        if row.meaning == 'ROW_COUNT' or row.meaning == 'ROWCOUNT':
            return int(file_name_parts_array[int(row.index_in_file_name)])
        else:
            i=i+1
    return -1
