import json
import requests

api_url = "https://api.torn.com/v2/"
api_key = "kHt0NAKPfjdKWprV"

def make_api_request(endpoint, api_key, **kwargs):
  """
  Makes an API request.

  Args:
    endpoint: The API endpoint.
    api_key: The API key.
    **kwargs: Optional keyword arguments for query parameters.

  Returns:
    The JSON response if successful, or None if an error occurred.
  """
  headers = {
      "Accept": "application/json",
      "Authorization": f"ApiKey {api_key}"  # Or your preferred auth method
  }
  try:
    response = requests.get(api_url + endpoint, headers=headers, params=kwargs)
    response.raise_for_status()  # Raise an exception for bad status codes
    return response.json()
  except requests.exceptions.RequestException as e:
    print(f"API request error: {e}")
    return None

def find_member(data, member_id):
  """
  Finds a member in the data by their ID.

  Args:
    data: The Python dictionary containing the member data.
    member_id: The ID of the member to find.

  Returns:
    The member dictionary if found, or None if not found.
  """
  for member in data['members']:
    if member['id'] == member_id:
      return member
  return None

def find_item(data, item_id):
    """
    Finds an item in the data by their ID.

    Args:
      data: The Python dictionary containing the item data.
      item_id: The ID of the item to find.

    Returns:
      The item dictionary if found, or None if not found.
    """
    return data['items'].get(str(item_id))

# Make necessary API calls
crime_data = make_api_request("faction/crimes", api_key, cat="available", offset=0)
faction_data = make_api_request("faction/members", api_key, striptags="true")
item_data = make_api_request("torn/items", api_key)

filtered_crimes = []

for crime in crime_data['crimes']:
    crime['issues'] = {
        'missing_items': [],
        'success_chance': []
    }

    for slot in crime['slots']:
        if (
            slot['item_requirement'] is not None and
            slot['item_requirement']['is_available'] is False and
            slot['user_id'] is not None
        ):
            crime['issues']['missing_items'].append({
                'position': slot['position'],
                'user_id': slot['user_id'],
                'item_id': slot['item_requirement']['id']
            })

        if (
            slot['success_chance'] < 75 and
            slot['user_id'] is not None
        ):
            crime['issues']['success_chance'].append({
                'position': slot['position'],
                'user_id': slot['user_id'],
                'success_chance': slot['success_chance']
            })

    if crime['issues']['missing_items'] or crime['issues']['success_chance']:
        filtered_crimes.append(crime)

# Print the filtered crimes
#print(json.dumps(filtered_crimes, indent=4))

# Example output of the data
print("\nIssues\n-------")
for crime in filtered_crimes:
    print(f"{crime['name']} (ID: {crime['id']})")

    if crime['issues']['missing_items']:
        print("Missing Items:")
        for item in crime['issues']['missing_items']:
            found_member = find_member(faction_data, item['user_id'])
            found_item = find_item(item_data, item['item_id'])
            print(f"    * {item['position']} - {found_member.get('name')} [{item['user_id']}] is missing required item: {found_item['name']} ({item['item_id']})")

    if crime['issues']['success_chance']:
        print("Low Success Chance:")
        for chance in crime['issues']['success_chance']:
            found_member = find_member(faction_data, chance['user_id'])
            print(f"    * {chance['position']} - {found_member.get('name')} [{chance['user_id']}] has less than 75% chance of success ({chance['success_chance']}).")
    print("")

