# frozen_string_literal: true

module FFaker
  module Bank
    extend ModuleUtils
    extend self

    COUNTRIES = {
      'AA' => 'AL##########################', # Albania
      'AD' => 'AD######################', # Andorra
      'AT' => 'AT##################', # Austria
      'AZ' => 'AZ##????####################', # Azerbaijan
      'BH' => 'BH##????##############', # Bahrain
      'BY' => 'BY##????####################', # Belarus
      'BE' => 'BE##############', # Belgium
      'BA' => 'BA##################', # Bosnia and Herzegovina
      'BR' => 'BR#########################P#', # Brazil
      'BG' => 'BG##????##############', # Bulgaria
      'CR' => 'CR####################', # Costa Rica
      'HR' => 'HR###################', # Croatia
      'CY' => 'CY##########################', # Cyprus
      'CZ' => 'CZ######################', # Czech Republic
      'DK' => 'DK################', # Denmark
      'DO' => 'DO##????####################', # Dominican Republic
      'SV' => 'SV##????####################', # El Salvador
      'EE' => 'EE##################', # Estonia
      'FO' => 'FO################', # Faroe Islands
      'FI' => 'FI################', # Finland
      'FR' => 'FR#########################', # France
      'GE' => 'GE##??################', # Georgia
      'DE' => 'DE####################', # Germany
      'GI' => 'GI##????###############', # Gibraltar
      'GR' => 'GR#########################', # Greece
      'GL' => 'GL################', # Greenland
      'GT' => 'GT##AGRO####################', # Guatemala
      'VA' => 'VA####################', # Holy See
      'HU' => 'HU##########################', # Hungary
      'IS' => 'IS########################', # Iceland
      'IQ' => 'IQ##????###############', # Iraq
      'IE' => 'IE##????##############', # Ireland
      'IL' => 'IL#####################', # Israel
      'IT' => 'IT##X######################', # Italy
      'JO' => 'JO##????######################', # Jordan
      'KZ' => 'KZ##################', # Kazakhstan
      'XK' => 'XK##################', # Kosovo
      'KW' => 'KW##????######################', # Kuwait
      'LV' => 'LV##????#############', # Latvia
      'LB' => 'LB##########################', # Lebanon
      'LI' => 'LI###################', # Liechtenstein
      'LT' => 'LT##################', # Lithuania
      'LU' => 'LU##################', # Luxembourg
      'MT' => 'MT##MALT#######################', # Malta
      'MR' => 'MR#########################', # Mauritania
      'MU' => 'MU##????###################MUR', # Mauritius
      'MD' => 'MD##??##################', # Moldova
      'MC' => 'MC#########################', # Monaco
      'ME' => 'ME####################', # Montenegro
      'NL' => 'NL##????##########', # Netherlands
      'MK' => 'MK#################', # North Macedonia
      'NO' => 'NO#############', # Norway
      'PK' => 'PK##????################', # Pakistan
      'PS' => 'PS##PALS#####################', # Palestine
      'PL' => 'PL##########################', # Poland
      'PT' => 'PT#######################', # Portugal
      'QA' => 'QA##????#####################', # Qatar
      'RO' => 'RO##????################', # Romania
      'LC' => 'LC##????########################', # Saint Lucia
      'SM' => 'SM##P######################', # San Marino
      'ST' => 'ST#######################', # Sao Tome and Principe
      'SA' => 'SA######################', # Saudi Arabia
      'RS' => 'RS####################', # Serbia
      'SC' => 'SC##????####################USD', # Seychelles
      'SK' => 'SK######################', # Slovak Republic
      'SI' => 'SI#################', # Slovenia
      'ES' => 'ES######################', # Spain
      'SE' => 'SE######################', # Sweden
      'CH' => 'CH###################', # Switzerland
      'TL' => 'TL#####################', # Timor-Leste
      'TN' => 'TN######################', # Tunisia
      'TR' => 'TR########################', # Turkey
      'UA' => 'UA###########################', # Ukraine
      'AE' => 'AE#####################', # United Arab Emirates
      'GB' => 'GB##????##############', # United Kingdom
      'VG' => 'VG##????################' # Virgin Islands, British
    }.freeze

    def iban(country_code: nil)
      return formatify_iban(fetch_sample(COUNTRIES.values)) unless country_code

      check_country_existence(country_code)
      formatify_iban(COUNTRIES[country_code.upcase])
    end

    def card_number
      FFaker.numerify('#### #### #### ####')
    end

    def card_expiry_date(year_range: 5, year_latest: -5, format: '%m/%y')
      FFaker::Time.date({ year_range: year_range, year_latest: year_latest }).strftime(format)
    end

    def card_type
      fetch_sample(CARD_TYPES)
    end

    def loan_interest_rate(min_rate = 1.5, max_rate = 15.0)
      fetch_sample(min_rate..max_rate).round(2)
    end

    def loan_term
      fetch_sample([12, 24, 36, 48, 60, 72, 84])
    end

    def loan_amount(min_amount = 1_000, max_amount = 100_000)
      fetch_sample(min_amount..max_amount)
    end

    private

    def formatify_iban(code)
      FFaker.bothify(code).upcase
    end

    def check_country_existence(country_code)
      return if COUNTRIES.key?(country_code.upcase)

      raise ArgumentError, "Unexpected country code: '#{country_code}'"
    end
  end
end
