from collections import Counter
from .translation_metric import diff_score
import numpy as np

def function11111(sources_name, trans , s, methods_name):
  dict1 = Counter(s)
  sorted_values = sorted(dict1.values(), reverse=True) # Sort the values
  sorted_dict = {}
  for i in sorted_values:
      for k in dict1.keys():
          if dict1[k] == i:
              sorted_dict[k] = dict1[k]
              #break
  sources = list(sorted_dict.keys())
  #print(sources)
  s1 = sources[0]
  s2 = sources[1]
  s3 = sources[2]
  s4 = sources[3]
  s5 = sources[4]

  di = {"0": s1, "1": s2, "2": s3, "3": s4, "4": s5,}
  # print(s1)
  # print(s2)
  # print(s3)
  # print(s4)
  # print(s5)
  # print(s6)

  rm =[]
  for r in Counter(s).keys():
    temp = [i for i in range(len(s)) if s[i] == r] 
    rm.append(temp)
  #print(rm)  
  resANDmethods_indexes={}
  fs = list(Counter(s).keys())
  for t in range(len(fs)):
    resANDmethods_indexes.update({fs[t]: rm[t]}) 
  #print(resANDmethods_indexes)

  a1 = list(sources_name.values()).index(s1)
  #print(a1)
  a2 = list(sources_name.values()).index(s2)
  #print(a2)
  a3 = list(sources_name.values()).index(s3)
  #print(a3)
  a4 = list(sources_name.values()).index(s4)
  #print(a4)
  a5 = list(sources_name.values()).index(s5)
  #print(a5)

  d1 = diff_score(trans[str(a1)], trans["0"])
  #print(d1)
  d2 = diff_score(trans[str(a2)], trans["0"])
  #print(d2)
  d3 = diff_score(trans[str(a3)], trans["0"])
  #print(d3)
  d4 = diff_score(trans[str(a4)], trans["0"])
  #print(d4)
  d5 = diff_score(trans[str(a5)], trans["0"])
  #print(d5)

  check =[d1, d2, d3, d4, d5]
  #print(check)
  a1 = np.array(check) 

  source1 = di[str(a1.argsort()[0])]
  source1_methods = [methods_name[str(i)] for i in resANDmethods_indexes[source1]]

  source2 = di[str(a1.argsort()[1])]
  #print(source2)
  source2_methods = [methods_name[str(i)] for i in resANDmethods_indexes[source2]]

  source3 = di[str(a1.argsort()[2])]
  #print(source3)
  source3_methods = [methods_name[str(i)] for i in resANDmethods_indexes[source3]]
  
  return (source1, source1_methods), (source2, source2_methods), (source3, source3_methods)

def function2111(sources_name, trans , s, methods_name):
  dict1 = Counter(s)
  sorted_values = sorted(dict1.values(), reverse=True) # Sort the values
  sorted_dict = {}
  for i in sorted_values:
      for k in dict1.keys():
          if dict1[k] == i:
              sorted_dict[k] = dict1[k]
              #break
  sources = list(sorted_dict.keys())
  #print(sources)
  s1 = sources[0]
  s2 = sources[1]
  s3 = sources[2]
  s4 = sources[3]

  di = {"0": s1, "1": s2, "2": s3, "3": s4}
  # print(s1)
  # print(s2)
  # print(s3)
  # print(s4)
  # print(s5)

  rm =[]
  for r in Counter(s).keys():
    temp = [i for i in range(len(s)) if s[i] == r] 
    rm.append(temp)
  #print(rm)  
  resANDmethods_indexes={}
  fs = list(Counter(s).keys())
  for t in range(len(fs)):
    resANDmethods_indexes.update({fs[t]: rm[t]}) 
  #print(resANDmethods_indexes)

  a2 = list(sources_name.values()).index(s2)
  #print(a2)
  a3 = list(sources_name.values()).index(s3)
  #print(a3)
  a4 = list(sources_name.values()).index(s4)
  #print(a4)
  
  d2 = diff_score(trans[str(a2)], trans["0"])
  #print(d2)
  d3 = diff_score(trans[str(a3)], trans["0"])
  #print(d3)
  d4 = diff_score(trans[str(a4)], trans["0"])
  #print(d4)

  check =[d2, d3, d4]
  #print(check)
  a1 = np.array(check) 
  
  source1 = s1
  source1_methods = [methods_name[str(i)] for i in resANDmethods_indexes[source1]]

  source2 = di[str(a1.argsort()[0]+1)]
  source2_methods = [methods_name[str(i)] for i in resANDmethods_indexes[source2]]

  source3 = di[str(a1.argsort()[1]+1)]
  source3_methods = [methods_name[str(i)] for i in resANDmethods_indexes[source3]]
  
  return (source1, source1_methods), (source2, source2_methods), (source3, source3_methods)

def function221(sources_name, trans , s, methods_name):
  dict1 = Counter(s)
  sorted_values = sorted(dict1.values(), reverse=True) # Sort the values
  sorted_dict = {}
  for i in sorted_values:
      for k in dict1.keys():
          if dict1[k] == i:
              sorted_dict[k] = dict1[k]
              #break
  sources = list(sorted_dict.keys())
  #print(sources)
  s1 = sources[0]
  s2 = sources[1]
  s3 = sources[2]

  di = {"0": s1, "1": s2, "2": s3}
  # print(s1)
  # print(s2)
  # print(s3)
  # print(s4)

  rm =[]
  for r in Counter(s).keys():
    temp = [i for i in range(len(s)) if s[i] == r] 
    rm.append(temp)
  #print(rm)  

  resANDmethods_indexes={}
  fs = list(Counter(s).keys())
  for t in range(len(fs)):
    resANDmethods_indexes.update({fs[t]: rm[t]}) 
  #print(resANDmethods_indexes)

  a1 = list(sources_name.values()).index(s1)
  #print(a1)
  a2 = list(sources_name.values()).index(s2)
  #print(a2)
  a3 = list(sources_name.values()).index(s3)
  #print(a3)

  d1 = diff_score(trans[str(a1)], trans["0"])
  #print(d1)
  d2 = diff_score(trans[str(a2)], trans["0"])
  #print(d2)
  
  check =[d1, d2]
  #print(check)
  a1 = np.array(check) 
  
  source1 = di[str(a1.argsort()[0])]
  #source1 = di[str(check1.index(temp1[0]))]
  source1_methods = [methods_name[str(i)] for i in resANDmethods_indexes[source1]]
  
  source2 = di[str(a1.argsort()[1])]
  source2_methods = [methods_name[str(i)] for i in resANDmethods_indexes[source2]]
  
  source3 = s3
  source3_methods = [methods_name[str(i)] for i in resANDmethods_indexes[source3]]
  return (source1, source1_methods), (source2, source2_methods), (source3, source3_methods)

def function311(sources_name, trans, s, methods_name):
  dict1 = Counter(s)
  sorted_values = sorted(dict1.values(), reverse=True) # Sort the values
  sorted_dict = {}
  for i in sorted_values:
      for k in dict1.keys():
          if dict1[k] == i:
              sorted_dict[k] = dict1[k]
              #break
  sources = list(sorted_dict.keys())
  #print(sources)
  s1 = sources[0]
  s2 = sources[1]
  s3 = sources[2]

  di = {"0": s1, "1": s2, "2": s3}
  # print(s1)
  # print(s2)
  # print(s3)

  rm =[]
  for r in Counter(s).keys():
    temp = [i for i in range(len(s)) if s[i] == r] 
    rm.append(temp)
  #print(rm)  

  resANDmethods_indexes={}
  fs = list(Counter(s).keys())
  for t in range(len(fs)):
    resANDmethods_indexes.update({fs[t]: rm[t]}) 
  #print(resANDmethods_indexes)

  a2 = list(sources_name.values()).index(s2)
  #print(a2)
  a3 = list(sources_name.values()).index(s3)
  #print(a3)

  d2 = diff_score(trans[str(a2)], trans["0"])
  #print(d2)
  d3 = diff_score(trans[str(a3)], trans["0"])
  #print(d3)

  check =[d2, d3]
  #print(check)
  a1 = np.array(check) 
  #source1 = di[str(a1.argsort()[0])]
  #temp = sorted(check)
  

  source1 = s1
  source1_methods = [methods_name[str(i)] for i in resANDmethods_indexes[source1]]
  
  source2 = di[str(a1.argsort()[0]+1)]
  #source2 = di[str(check.index(temp[0])+1)]
  source2_methods = [methods_name[str(i)] for i in resANDmethods_indexes[source2]]

  source3 = di[str(a1.argsort()[1]+1)]
  #source3 = di[str(check.index(temp[1])+1)]
  source3_methods = [methods_name[str(i)] for i in resANDmethods_indexes[source3]]  
  return (source1, source1_methods), (source2, source2_methods), (source3, source3_methods)


def function41(sources_name, trans , s, methods_name):
  dict1 = Counter(s)
  sorted_values = sorted(dict1.values(), reverse=True) # Sort the values
  sorted_dict = {}
  for i in sorted_values:
      for k in dict1.keys():
          if dict1[k] == i:
              sorted_dict[k] = dict1[k]
              #break
  sources = list(sorted_dict.keys())
  #print(sources)
  s1 = sources[0]
  s2 = sources[1]
  di = {"0": s1, "1": s2}
  #print(s1)
  #print(s2)

  rm =[]
  for r in Counter(s).keys():
    temp = [i for i in range(len(s)) if s[i] == r] 
    rm.append(temp)
  #print(rm)  
  resANDmethods_indexes={}
  fs = list(Counter(s).keys())
  for t in range(len(fs)):
    resANDmethods_indexes.update({fs[t]: rm[t]}) 
  #print(resANDmethods_indexes)   

  source1 = s1
  source1_methods = [methods_name[str(i)] for i in resANDmethods_indexes[source1]]
  source2 = s2
  source2_methods = [methods_name[str(i)] for i in resANDmethods_indexes[source2]] 
  source3 = ""
  source3_methods = ""
  return (source1, source1_methods), (source2, source2_methods), (source3, source3_methods)

def function5(sources_name, trans , s, methods_name):
  s1 = list(Counter(s).keys())[0]
  #print(s1)
  source1 = s1
  source1_methods = list(methods_name.values())
  source2 = ""
  source2_methods = ""
  source3 = ""
  source3_methods = ""
  return (source1, source1_methods), (source2, source2_methods), (source3, source3_methods)

def selection_source(S, sources_name, trans, methods_name ):
  s = []
  for string in S:
    a = string.replace(" ", "GOOGLE")
    s.append(a)
  seq = list(Counter(s).values())
  seq.sort(reverse = True)
  #print(seq)

  if seq == [1, 1, 1, 1, 1]:
    sources1ANDmethods1, sources2ANDmethods2, sources3ANDmethods3 = function11111(sources_name, trans, s, methods_name)
    return sources1ANDmethods1, sources2ANDmethods2, sources3ANDmethods3  
  if seq == [2, 1, 1, 1]:
    sources1ANDmethods1, sources2ANDmethods2, sources3ANDmethods3 = function2111(sources_name, trans, s, methods_name)
    return sources1ANDmethods1, sources2ANDmethods2, sources3ANDmethods3  
  if seq == [2, 2, 1]:
    sources1ANDmethods1, sources2ANDmethods2, sources3ANDmethods3 = function221(sources_name, trans, s, methods_name)
    return sources1ANDmethods1, sources2ANDmethods2, sources3ANDmethods3 
     
  if seq == [3, 1, 1]:
    sources1ANDmethods1, sources2ANDmethods2, sources3ANDmethods3 = function311(sources_name, trans, s, methods_name)
    return sources1ANDmethods1, sources2ANDmethods2, sources3ANDmethods3 

  if seq == [4, 1] or seq == [3, 2]: 
    sources1ANDmethods1, sources2ANDmethods2, sources3ANDmethods3 = function41(sources_name, trans, s, methods_name)
    return sources1ANDmethods1, sources2ANDmethods2, sources3ANDmethods3
  if seq == [5]: 
    sources1ANDmethods1, sources2ANDmethods2, sources3ANDmethods3 = function5(sources_name, trans, s, methods_name)
    return sources1ANDmethods1, sources2ANDmethods2, sources3ANDmethods3 

def selection_source_transliteration(sources_name, O, priority_list):
  seq = list(Counter(O).values())
  seq.sort(reverse = True)
  #print(seq)
  check=[]
  temp="y"
  for i in range(len(seq)-1):
    if seq[0]>seq[i+1]:
      check.append(i)
  #print(check)
  if len(check)==(len(seq)-1):
    temp = "yes" 

  #print("strating", temp)

  if temp=="yes":
    #print(" in if")
    (o1, s1), (o2, s2) = two_sources_two_outputs(sources_name, O)
    output1 = o1
    source1 = s1
    #print(output1, source1)
    if len(seq)==2:
      output2 = o2
      source2 = s2
      #print("1", output2, source2)
    else:
      temp1="y"
      check1=[]
      for i in range(len(seq)-2):
        if seq[1]>seq[i+2]:
          check.append(i)
      #print(check1)
      if len(check1)==(len(seq)-2):
        temp1 = "yes"  
      if temp1=="yes":
        output2 = o2
        source2 = s2
        #print("2", output2, source2)
      else:
        for i in priority_list:
         temp_source="test"
         if i not in source1: 
           temp_source = i
           break
        #print(temp_source) 
        if temp_source=="test":
          output2 = o2
          source2 = s2
        else:    
          if temp_source != priority_list[1]:
            output2= O[priority_list.index(temp_source)]
            source2=temp_source
            #print("3", output2, source2)
          else:
            output2= O[priority_list.index(priority_list[1])]
            source2=priority_list[1]
            #print("4", output2, source2)

  else:
    #print("in else")
    (o1, s1), (o2, s2) = two_sources_two_outputs(sources_name, O)
    #print(o1, s1)
    #print(o2, s2)
    if priority_list[0] in s1:
      #print("1")
      output1= o1
      source1= s1
      #print(output1, source1)
    elif priority_list[0] in s2:
      #print("2")
      output1= o2
      source1= s2
      print(output1, source1)
    else:
      #print("3")
      output1=O[0]
      source1= priority_list[0]
      #print(output1, source1)
    temp_source = "test"  
    for i in priority_list:
      #print(i)
      if i not in source1: 
        temp_source = i
        break
    #print(temp_source)
    if temp_source=="test": 
        output2 = o2
        source2 = s2
    else:    
      if temp_source != priority_list[1]:
        output2= O[priority_list.index(temp_source)]
        source2=temp_source
        #print("4", output2, source2)
      else:
        output2= O[priority_list.index(priority_list[1])]
        source2=priority_list[1]
        #print("5", output2, source2)   
  return(output1, source1), (output2, source2)

def two_sources_two_outputs(sources_name, O):
  dict1 = Counter(O)
  #print(dict1)
  sorted_values = sorted(dict1.values(), reverse=True) # Sort the values
  sorted_dict = {}
  for i in sorted_values:
      for k in dict1.keys():
          if dict1[k] == i:
              sorted_dict[k] = dict1[k]       
  sources = list(sorted_dict.keys())
  #print(sources)
  rm =[]
  for r in Counter(O).keys():
    temp = [i for i in range(len(O)) if O[i] == r] 
    rm.append(temp)
  #print(rm)  
  resANDmethods_indexes={}
  fs = list(Counter(O).keys())
  for t in range(len(fs)):
    resANDmethods_indexes.update({fs[t]: rm[t]}) 
  #print(resANDmethods_indexes)
  out1 = sources[0]
  source1 = [sources_name[str(i)] for i in resANDmethods_indexes[out1]]
  if len(sources)==1:
    return (out1, source1), ("", "")
  else:  
    out2 = sources[1]
    source2 = [sources_name[str(i)] for i in resANDmethods_indexes[out2]]
    return (out1, source1), (out2, source2)