from app import avatar
from data import model
from data.database import User, FederatedLogin, Team as TeamTable, Repository
from endpoints.api.robot_models_interface import (RobotInterface, Robot, RobotWithPermissions, Team,
                                                  Permission)


class RobotPreOCIModel(RobotInterface):
  def list_robot_permissions(self, username):
    permissions = model.permission.list_robot_permissions(username)
    return [Permission(permission.repository.name, permission.repository.visibility.name, permission.role.name) for
            permission in permissions]

  def list_entity_robot_permission_teams(self, prefix, include_permissions=False):
    tuples = model.user.list_entity_robot_permission_teams(prefix,
                                                           include_permissions=include_permissions)
    robots = {}
    robot_teams = set()

    for robot_tuple in tuples:
      robot_name = robot_tuple.get(User.username)
      if robot_name not in robots:
        robot_dict = {
          'name': robot_name,
          'token': robot_tuple.get(FederatedLogin.service_ident),
        }

        if include_permissions:
          robot_dict.update({
            'teams': [],
            'repositories': []
          })
      robots[robot_name] = Robot(robot_dict['name'], robot_dict['token'])
      if include_permissions:
        team_name = robot_tuple.get(TeamTable.name)
        repository_name = robot_tuple.get(Repository.name)

        if team_name is not None:
          check_key = robot_name + ':' + team_name
          if check_key not in robot_teams:
            robot_teams.add(check_key)

            robot_dict['teams'].append(Team(
              team_name,
              avatar.get_data(team_name, team_name, 'team')
            ))

        if repository_name is not None:
          if repository_name not in robot_dict['repositories']:
            robot_dict['repositories'].append(repository_name)
        robots[robot_name] = RobotWithPermissions(robot_dict['name'], robot_dict['token'], robot_dict['teams'],
                                                  robot_dict['repositories'])

    return robots.values()

  def regenerate_user_robot_token(self, robot_shortname, owning_user):
    robot, password = model.user.regenerate_robot_token(robot_shortname, owning_user)
    return Robot(robot.username, password)

  def regenerate_org_robot_token(self, robot_shortname, orgname):
    parent = model.organization.get_organization(orgname)
    robot, password = model.user.regenerate_robot_token(robot_shortname, parent)
    return Robot(robot.username, password)

  def delete_robot(self, robot_username):
    model.user.delete_robot(robot_username)

  def create_user_robot(self, robot_shortname, owning_user):
    robot, password = model.user.create_robot(robot_shortname, owning_user)
    return Robot(robot.username, password)

  def create_org_robot(self, robot_shortname, orgname):
    parent = model.organization.get_organization(orgname)
    robot, password = model.user.create_robot(robot_shortname, parent)
    return Robot(robot.username, password)

  def get_org_robot(self, robot_shortname, orgname):
    parent = model.organization.get_organization(orgname)
    robot, password = model.user.get_robot(robot_shortname, parent)
    return Robot(robot.username, password)

  def get_user_robot(self, robot_shortname, owning_user):
    robot, password = model.user.get_robot(robot_shortname, owning_user)
    return Robot(robot.username, password)


pre_oci_model = RobotPreOCIModel()