require 'colored'
require 'credentials_manager/appfile_config'
require 'yaml'

require_relative 'tunes/tunes_client'

module Spaceship
  class SpaceauthRunner
    def initialize(username: nil)
      @username = username
      @username ||= CredentialsManager::AppfileConfig.try_fetch_value(:apple_id)
      @username ||= ask("Username: ")
    end

    def run
      begin
        puts("Logging into to iTunes Connect (#{@username})...")
        Spaceship::Tunes.login(@username)
        puts("Successfully logged in to iTunes Connect".green)
        puts("")
      rescue
        puts("Could not login to iTunes Connect".red)
        puts("Please check your credentials and try again.".yellow)
        puts("This could be an issue with iTunes Connect,".yellow)
        puts("Please try unsetting the FASTLANE_SESSION environment variable".yellow)
        puts("and re-run `fastlane spaceauth`".yellow)
        raise "Problem connecting to iTunes Connect"
      end

      itc_cookie_content = Spaceship::Tunes.client.store_cookie

      # The only value we actually need is the "DES5c148586daa451e55afb017aa62418f91" cookie
      # We're not sure if the key changes
      #
      # Example:
      # name: DES5c148586daa451e55afb017aa62418f91
      # value: HSARMTKNSRVTWFlaF/ek8asaa9lymMA0dN8JQ6pY7B3F5kdqTxJvMT19EVEFX8EQudB/uNwBHOHzaa30KYTU/eCP/UF7vGTgxs6PAnlVWKscWssOVHfP2IKWUPaa4Dn+I6ilA7eAFQsiaaVT
      cookies = YAML.safe_load(
        itc_cookie_content,
        [HTTP::Cookie, Time], # classes whitelist
        [],                   # symbols whitelist
        true                  # allow YAML aliases
      )

      # We remove all the un-needed cookies
      cookies.select! do |cookie|
        cookie.name.start_with?("DES5") || cookie.name == 'dqsid'
      end

      yaml = cookies.to_yaml.gsub("\n", "\\n")

      puts("---")
      puts("")
      puts("Pass the following via the FASTLANE_SESSION environment variable:")
      puts(yaml.cyan.underline)
      puts("")
      puts("")
      puts("Example:")
      puts("export FASTLANE_SESSION='#{yaml}'".cyan.underline)
    end
  end
end
