#coding=utf-8

module JupyterService

    def _open_shixun_jupyter(shixun)
        if shixun.is_jupyter?
            shixun_tomcat = edu_setting('cloud_bridge')
            uri = "#{shixun_tomcat}/bridge/jupyter/get"
            tpiID = "tpm#{shixun.id}"
            mount = shixun.data_sets.present?
            gitUrl = "#{edu_setting('git_address_domain')}/#{shixun.repo_path}"
            params = {tpiID: tpiID, identifier: shixun.identifier, needMount: mount, gitUrl: gitUrl,
                      :containers => "#{Base64.urlsafe_encode64(shixun_container_limit(shixun))}"}
    
            logger.info "test_juypter: uri->#{uri}, params->#{params}"
            res = uri_post uri, params
            if res && res['code'].to_i != 0
                raise("实训云平台繁忙(繁忙等级:99)")
            end

            logger.info "test_juypter: #{res}"

            @shixun_jupyter_port = res['port']

            "#{jupyter_service(res['port'])}/notebooks/data/workspace/myshixun_#{tpiID}/01.ipynb"
        end
    end

    def jupyter_url_with_shixun(shixun)
        #打开tpm - juypter接口
        _open_shixun_jupyter(shixun)
    end

    def jupyter_port_with_shixun(shixun)
        if @shixun_jupyter_port.to_i <=0 
            _open_shixun_jupyter(shixun)
        end
        @shixun_jupyter_port
    end


    def _open_game_jupyter(myshixun)
        ## 打开tpi
        shixun = myshixun.shixun

        if shixun.is_jupyter?
            shixun_tomcat = edu_setting('cloud_bridge')
            uri = "#{shixun_tomcat}/bridge/jupyter/get"

            tpiID = myshixun.id
            mount = myshixun.shixun.data_sets.present?

            gitUrl = "#{edu_setting('git_address_domain')}/#{myshixun.repo_path}"
            params = { tpiID: tpiID, 
                       identifier: shixun.identifier,
                       myshixunIdentifier: myshixun.identifier,
                       gitUrl: gitUrl,
                       needMount: mount,
                       :containers => "#{Base64.urlsafe_encode64(shixun_container_limit(shixun))}"}
            res = uri_post uri, params

            logger.info "test_juypter: #{res}"
            
            if res && res['code'].to_i != 0
                raise("实训云平台繁忙(繁忙等级:99)")
            end

            @game_jupyter_port = res['port']

            repo_save_path = myshixun.repo_save_path

            "#{jupyter_service(res['port'])}/notebooks/data/workspace/myshixun_#{tpiID}/#{repo_save_path}/01.ipynb"
        end
    end


    def jupyter_url_with_game(myshixun)
        _open_game_jupyter(myshixun)
    end

    def jupyter_port_with_game(myshixun)
        if @game_jupyter_port.to_i <=0 
            _open_game_jupyter(myshixun)
        end
        @game_jupyter_port
    end

    def jupyter_save_with_shixun(shixun,jupyter_port)
        author_name = current_user.real_name
        author_email = current_user.git_mail
        message = "User submitted"

        tpiID = "tpm#{shixun.id}"

        src_url = "#{jupyter_service(jupyter_port)}/nbconvert/notebook/data/workspace/myshixun_#{tpiID}/01.ipynb?download=true"

        response = Faraday.get(src_url)

        if response.status.to_i != 200
            raise("获取文件内容失败:#{response.status}")
        end

        content = response.body.force_encoding('utf-8')
        
        c = GitService.update_file(repo_path: shixun.repo_path,
            file_path: "01.ipynb",
            message: message,
            content: content,
            author_name: author_name,
            author_email: author_email)

        return c.size
    end

    def jupyter_save_with_game(myshixun,jupyter_port)
        author_name = current_user.real_name
        author_email = current_user.git_mail
        message = "User submitted"

        tpiID = myshixun.id

        repo_save_path = myshixun.repo_save_path
        src_url = "#{jupyter_service(jupyter_port)}/nbconvert/notebook/data/workspace/myshixun_#{tpiID}/#{repo_save_path}/01.ipynb?download=true"
        response = Faraday.get(src_url)

        if response.status.to_i != 200
            raise("获取文件内容失败:#{response.status}")
        end

        content = response.body.force_encoding('utf-8')
        
        c = GitService.update_file(repo_path: myshixun.repo_path,
            file_path: "01.ipynb",
            message: message,
            content: content,
            author_name: author_name,
            author_email: author_email)

        return c.size
    end


    ##重置jupyter环境
    def jupyter_tpi_reset(myshixun)
        jupyter_delete_tpi(myshixun)
        url = jupyter_url_with_game(myshixun)
        port = jupyter_port_with_game(myshixun)
        {url: url, port: port}
    end

    ## 重置tpm环境
    def jupyter_tpm_reset(shixun)
        jupyter_delete_tpm(shixun)

        url = jupyter_url_with_shixun(shixun)
        port = jupyter_port_with_shixun(shixun)

        {url: url, port: port}
    end



    # 删除pod
    def jupyter_delete_tpi(myshixun) 
        myshixun_id = myshixun.id
        digest = myshixun.identifier + edu_setting('bridge_secret_key')
        digest_key = Digest::SHA1.hexdigest("#{digest}")
        begin
            shixun_tomcat = edu_setting('cloud_bridge')
            uri = "#{shixun_tomcat}/bridge/jupyter/delete"
            Rails.logger.info("#{current_user} => cloese_jupyter digest is #{digest}")
            params = {:tpiID => myshixun_id, :digestKey => digest_key, :identifier => myshixun.identifier}
            res = uri_post uri, params
            if res && res['code'].to_i != 0
                raise("实训云平台繁忙(繁忙等级:110)")
            end
        end
    end


    def jupyter_delete_tpm(shixun) 
        tpiID = "tpm#{shixun.id}"
        digest = shixun.identifier + edu_setting('bridge_secret_key')
        digest_key = Digest::SHA1.hexdigest("#{digest}")
        begin
            shixun_tomcat = edu_setting('cloud_bridge')
            uri = "#{shixun_tomcat}/bridge/jupyter/delete"
            Rails.logger.info("#{current_user} => cloese_jupyter digest is #{digest}")
            params = {:tpiID => tpiID, :digestKey => digest_key, :identifier => shixun.identifier}
            res = uri_post uri, params
            if res && res['code'].to_i != 0
                raise("实训云平台繁忙(繁忙等级:110)")
            end
        end
    end

    def jupyter_service jupyter_port
        edu_setting('jupyter_service').gsub("PORT", jupyter_port)
    end

    def _jupyter_active(tpiID)
        shixun_tomcat = edu_setting('cloud_bridge')
        uri = "#{shixun_tomcat}/bridge/jupyter/active"
        params = {:tpiID => tpiID}
        res = uri_post uri, params
        if res && res['code'].to_i != 0
            raise("实训云平台繁忙(繁忙等级:120)")
        end
    end

    # tpm 延时
    def jupyter_active_tpm(shixun)
        tpiID = "tpm#{shixun.id}"
        _jupyter_active(tpiID)
    end

    # tpi 延时
    def jupyter_active_tpi(myshixun)
      tpiID = myshixun.id 
        _jupyter_active(tpiID)
    end

    def _jupyter_timeinfo(tpiID)
        shixun_tomcat = edu_setting('cloud_bridge')
        uri = "#{shixun_tomcat}/bridge/jupyter/getTimeInfo"
        params = {:tpiID => tpiID}
        res = uri_post uri, params
        if res && res['code'].to_i != 0
            raise("实训云平台繁忙(繁忙等级:130)")
        end

        res['data']
    end

    # 获取时间参数
    def jupyter_timeinfo_tpm(shixun)
      tpiID = "tpm#{shixun.id}"
      _jupyter_timeinfo(tpiID)
    end

    # 获取时间参数
    def jupyter_timeinfo_tpi(myshixun)
      tpiID = myshixun.id 
      _jupyter_timeinfo(tpiID)
    end
end