#coding=utf-8

require_relative 'helper'

module Trustie
  module Gitlab
    module UserLevel
        GUEST     = 10
        REPORTER  = 20
        DEVELOPER = 30
        MASTER    = 40
        OWNER     = 50
        # 项目公开和私有
        PUBLIC = 20
        PRIVATE = 0
    end

    class Sync
        attr :g
        include Helper
        
        def initialize
            @g = ::Gitlab.client
        end

        def sync_user(user)
            u = add_user(user)
            if (!("day,none,all".include? user.mail_notification) or user.mail_notification.blank?)
              user.mail_notification = "day"
            end
            user.save!
            u
        end


        def create_project(project, repository)
            gid = project.owner.gid
            unless gid
              gid = sync_user(project.owner).id
            end
            raise "unknow gid" unless gid

            gproject = g.create_project(repository.identifier, 
                      path: repository.identifier,
                      description: project.description, 
                      wiki_enabled: false,
                      wall_enabled: false,
                      issues_enabled: false,
                      snippets_enabled: false,
                      public: false,
                      user_id: gid,
                      visibility_level: project.is_public? ? UserLevel::PUBLIC : UserLevel::PRIVATE
                      )
            project.gpid = gproject.id
            project.save!

            # 创建的时候一并同步成员及角色
            project.members.each do |m|
              begin
                gid = m.user.gid
                unless gid
                  gid = sync_user(m.user).id
                end
                self.g.add_team_member(gproject.id, gid, get_gitlab_role(m))
              rescue => e
                puts e
              end
            end
        end

        def sync_project(project, opt={})
            gid = project.owner.gid
            unless gid
              gid = sync_user(project.owner).id
            end

            raise "unknow gid" unless gid
            path = opt[:path]
            raise "unknow path" unless path
            import_url = opt[:import_url]
            raise "unknow import_url" unless import_url

            if opt[:password]
                import_url.sub('@', ":#{opt[:password]}@")
            end

            # import url http://xianbo_trustie2:1234@repository.trustie.net/xianbo/trustie2.git
            # can use password
            gproject = self.g.create_project(path, 
                            path: path,
                            description: project.description, 
                            wiki_enabled: false,
                            wall_enabled: false,
                            issues_enabled: false,
                            snippets_enabled: false,
                            merge_requests_enabled: true,
                            public: false,
                            user_id: gid,
                            import_url: import_url,
                            visibility_level: project.is_public? ? UserLevel::PUBLIC : UserLevel::PRIVATE
                            )
            project.gpid = gproject.id
            project.save!
            puts "Successfully created #{project.name}"
            # add team members
            #
            
            project.members.each do |m|
              begin
                gid = m.user.gid
                unless gid
                    gid = sync_user(m.user).id
                end
                self.g.add_team_member(gproject.id, gid, get_gitlab_role(m))
              rescue => e
                puts e
              end
            end
        end

        def only_members(project)
          project.members.each do |m|
            begin
              gid = m.user.gid
              if gid.nil?
                gid = sync_user(m.user).id
              end
              self.g.add_team_member(project.gpid, gid, get_gitlab_role(m))
            rescue => e
              puts e
            end
          end
        end

        def remove_project
        end


    end

  end
end