import csv
import io
import re

def items_csv_to_dict(items_csv_reader, irt_model):
  items = []
  headers = []

  # get headers and items
  for key, row in enumerate(items_csv_reader):
    if key == 0:
      headers = row
    else:
      item = { 'attributes': [] }

      for key, col in enumerate(headers):
        if key == 0:
          item[col] = row[key]
        # b param - tmep fix! use irt model b param for proper reference
        elif key == (1 - len(headers)):
          item['b_param'] = row[key]
        elif key > 1:
          item['attributes'].append({
            'id': col,
            'value': row[key],
            'type': 'metadata'
          })

      items.append(item)

  return items

def solution_to_file(buffer, total_form_items, forms):
  wr = csv.writer(buffer, dialect='excel', delimiter=',')

  # write header row for first row utilizing the total items all forms will have
  # fill the rows with the targets and cut score then the items
  header = ['status']

  for result in forms[0].tif_results:
    header += [f'tif @ {round(result.theta, 2)}']

  for result in forms[0].tcc_results:
    header += [f'tcc @ {round(result.theta, 2)}']

  header += ['cut score'] + [x + 1 for x in range(total_form_items)]
  wr.writerow(header)

  # add each form as row to processed csv
  for form in forms:
    row = [form.status]

    for result in form.tif_results + form.tcc_results:
      row += [f'value - {result.value}\nresult - {round(result.result, 2)}']

    # provide generated items and cut score
    row += [round(form.cut_score, 2)] + [item.id for item in form.items]
    wr.writerow(row)

  buff2 = io.BytesIO(buffer.getvalue().encode())

  return buff2

def error_to_file(buffer, error):
  wr = csv.writer(buffer, dialect='excel', delimiter=',')
  wr.writerow(['status'])
  wr.writerow([error.args[0]])

  return io.BytesIO(buffer.getvalue().encode())

def key_to_uuid(key):
  return re.split("_", key)[0]

def solution_items(variables, solver_run):
  form_items = []

  for v in variables:
    if v.varValue > 0:
      item_id = v.name.replace('Item_', '')
      item = solver_run.get_item(item_id)
      # add item to list and then remove from master item list
      form_items.append(item)

  return form_items