require 'credentials_manager'

module Fastlane
  module Actions
    class RegisterDevicesAction < Action
      UDID_REGEXP = /^\h{40}$/

      def self.is_supported?(platform)
        platform == :ios
      end

      def self.run(params)
        require 'spaceship'

        devices = params[:devices]

        credentials = CredentialsManager::PasswordManager.shared_manager(params[:username])
        Spaceship::Portal.login(credentials.username, credentials.password)

        if devices
          device_objs = devices.map do |k, v|
            raise "Passed invalid UDID: #{v} for device: #{k}".red unless UDID_REGEXP =~ v
            Spaceship::Device.create!(name: k, udid: v)
          end
        elsif devices_file
          devices_file = CSV.read(File.expand_path(File.join(devices_file)), col_sep: "\t")

          raise 'Please provide a file according to the Apple Sample UDID file (https://devimages.apple.com.edgekey.net/downloads/devices/Multiple-Upload-Samples.zip)'.red unless devices_file.first == ['Device ID', 'Device Name']

          device_objs = devices_file.drop(1).map do |device|
            raise 'Invalid device line, please provide a file according to the Apple Sample UDID file (https://devimages.apple.com.edgekey.net/downloads/devices/Multiple-Upload-Samples.zip)'.red unless device.count == 2
            raise "Passed invalid UDID: #{device[0]} for device: #{device[1]}".red unless UDID_REGEXP =~ device[0]

            Spaceship::Device.create!(name: device[1], udid: device[0])
          end
        else
          raise 'You must pass either a valid `devices` or `devices_file`. Please check the readme.'.red
        end

        Helper.log.info "Successfully registered new devices.".green
      end

      def self.description
        "Registers new devices to the Apple Dev Portal"
      end

      def self.available_options
        [
          FastlaneCore::ConfigItem.new(key: :devices,
                                       env_name: "FL_REGISTER_DEVICES_DEVICES",
                                       description: "A hash of devices, with the name as key and the UDID as value",
                                       is_string: false,
                                       optional: true),
          FastlaneCore::ConfigItem.new(key: :devices_file,
                                       env_name: "FL_REGISTER_DEVICES_FILE",
                                       description: "Provide a path to the devices to register",
                                       optional: true,
                                       verify_block: Proc.new do |value|
                                        raise "Could not find file '#{value}'".red unless File.exists?(value)
                                       end),
          FastlaneCore::ConfigItem.new(key: :team_id,
                                       env_name: "FASTLANE_TEAM_ID",
                                       description: "optional: Your team ID",
                                       optional: true),
          FastlaneCore::ConfigItem.new(key: :username,
                                       env_name: "DELIVER_USER",
                                       description: "Optional: Your Apple ID",
                                       default_value: CredentialsManager::AppfileConfig.try_fetch_value(:apple_id)),
        ]
      end

      def self.author
        "lmirosevic"
      end
    end
  end
end