import os
import time
import json
import csv
import shutil
import requests
from datetime import datetime
import logging

logging.basicConfig(filename='decisions.log', level=logging.ERROR,
                    format='%(asctime)s - %(levelname)s - %(message)s')


def load_config():
    with open('config.json') as user_file:
        return json.load(user_file)


def get_user_identity_id(cycle, session, config):
    headers = {'x-api-key': config['api_key']}
    response = session.get(config['url_link'] + '/api/v1/user_identities/', headers=headers)
    cycleItem = response.json()['user_identities']
    for item in cycleItem:
        if item['cycle'] == cycle:
            userIdentityID = item['id']
    return userIdentityID


def update_designation(session, config, user_identity_id, program_id, cas_id, decision_id):
    url = f"{config['url_link']}/api/v1/user_identities/{user_identity_id}/programs/{program_id}/applicants_by_cas_id/{cas_id}/designation"
    request_body = {
        "designation": {
            "decision_id": decision_id
        }
    }
    request_headers = {
        'x-api-key': config['api_key'],
        'Content-Type': 'application/json'
    }
    return session.patch(url, json=request_body, headers=request_headers)


def archive_file(config, file_name):
    destination_directory = config['working_dir'] + "Archive"
    timestamp = datetime.now().strftime("%Y-%m-%d_%H-%M-%S")
    destination_file = f"{timestamp}_{file_name}"
    destination_path = os.path.join(destination_directory, destination_file)
    shutil.move(config['working_dir'] + "test1.csv", destination_path)
    os.remove(config['working_dir'] + file_name)


def execute_job():
    config = load_config()
    file_path = os.path.join(config['working_dir'], config['file_name'])

    with requests.Session() as session:
        while True:
            if os.path.exists(file_path):
                try:
                    shutil.copy(file_path, config['working_dir'] + "test1.csv")
                    with open(file_path, 'r', encoding='utf-8', errors='replace') as file:
                        csvreader = csv.reader(file)
                        next(csvreader)
                        for row_number, row in enumerate(csvreader, start=1):
                            cas_id = str(row[0])
                            program_id = str(row[1])
                            decision_id = int(row[3])
                            user_identity_id = get_user_identity_id(str(row[2]), session, config)
                            r = update_designation(session, config, user_identity_id, program_id, cas_id,
                                                   decision_id)  # Pass session
                            with open(config['working_dir'] + "test1.csv", "r", newline="", encoding='utf-8',
                                      errors='replace') as file1:
                                reader = csv.reader(file1)
                                rows = list(reader)
                                if 1 <= row_number <= len(rows) - 1:
                                    rows[row_number].append(str(r.status_code).strip())
                                else:
                                    break
                                with open(config['working_dir'] + "test1.csv", "w", newline="", encoding='utf-8',
                                          errors='replace') as file2:
                                    writer = csv.writer(file2)
                                    writer.writerows(rows)
                    archive_file(config, config['file_name'])
                except Exception as e:
                    logging.error(f'An error occurred: {str(e)}', exc_info=True)
            time.sleep(10)


if __name__ == "__main__":
    execute_job()
