class Projects::VerifyAuthTokenService < ApplicationService
    attr_accessor :url, :token

    def initialize(url, token)
        @url   = url
        @token = token
        @repo = nil
        @owner = nil
        @website = nil
        @success = false
    end

    def call 
        Rails.logger.info("###### VerifyAuthTokenService begin ######")
        regular_url
        to_verify
        Rails.logger.info("##### VerifyAuthTokenService end ######")
        return @success
    end

    private 
    def regular_url
        regx = /\/\/[\s\S]*.git$/  #获取字串
        data = (regx.match @url).to_s[2..-5].to_s.split("/")
        @website = data[0]
        @owner  = data[1]
        @repo = data[2]
    end


    def to_verify
        data = case @website
        when "github.com"
            github_verify
        when "gitlab.com"
            gitlab_verify
        when "gitee.com"
            gitee_verify
        when "gitlink.org.cn"
            gitlink_verify
        when "gitea.com"
            gitea_verify
        when "gitcode.com"
            gitcode_verify
        else 
            @success = nil
        end
    end

    def gitcode_verify 
        url = "/api/v5/user"
        api_url = "https://api.gitcode.com"
        client = Faraday.new(url: api_url)
        client.options["open_timeout"] = 100
        client.options["timeout"] = 100
        client.options["write_timeout"] = 100
        req_params={
            access_token: @token
        }
        response = client.public_send("get", url, req_params)
        @success = true if response.status == 200 
    end

    def gitea_verify 
        url = "/api/v1/user"
        api_url = "https://gitea.com"
        client = Faraday.new(url: api_url)
        client.options["open_timeout"] = 100
        client.options["timeout"] = 100
        client.options["write_timeout"] = 100
        req_params={
            token: @token
        }
        response = client.public_send("get", url, req_params)
        @success = true if response.status == 200 
    end

    def gitlink_verify
        url = "/api/v1/user"
        api_url = "https://cdn05042023.gitlink.org.cn"
        client = Faraday.new(url: api_url)
        client.options["open_timeout"] = 100
        client.options["timeout"] = 100
        client.options["write_timeout"] = 100
        req_params={
            token: @token
        }
        response = client.public_send("get", url, req_params)
        @success = true if response.status == 200 
    end

    def gitee_verify
        url = "/api/v5/repos/#{@owner}/#{@repo}"
        api_url=  "https://gitee.com"
        client = Faraday.new(url: api_url)
        client.options["open_timeout"] = 100
        client.options["timeout"] = 100
        client.options["write_timeout"] = 100
        req_params={
            access_token: @token,
            owner: @owner,
            repo: @repo
        }
        response = client.public_send("get", url, req_params)
        @success = true if response.status == 200 
    end

    def github_verify
        url = "/octocat"
        api_url=  "https://api.github.com"
        client = Faraday.new(url: api_url)
        client.options["open_timeout"] = 100
        client.options["timeout"] = 100
        client.options["write_timeout"] = 100
        client.headers["Authorization"] = "Bearer #{@token}"
        response = client.public_send("get", url)
        @success = true if response.status == 200 
    end

    def gitlab_verify
        url = "/api/v4/projects"
        api_url=  "https://gitlab.com"
        client = Faraday.new(url: api_url)
        client.options["open_timeout"] = 100
        client.options["timeout"] = 100
        client.options["write_timeout"] = 100
        req_params={
            private_token: @token
        }
        response = client.public_send("get", url, req_params)
        @success = true if response.status == 200 
    end
end