class Uke
  class Chord
    attr_reader :name, :key, :positions, :fingers

    def initialize(line)
      parts = line.split(/\s{2,}/).map { |part| part.split(',') }

      @name = parts[0].join.tr(' ', '')
      @key = @name[0...2]
      @positions = parts[1].map(&:to_i)
      @fingers = parts[2] && parts[2].map(&:to_i)
    end
  end

  ENHARMONIC_EQUIVALENTS = {
    'A#' => 'Bb',
    'C#' => 'Db',
    'D#' => 'Eb',
    'F#' => 'Gb',
    'G#' => 'Ab'
  }

  # compare https://ukulele-chords.com and https://ukulelehelper.com
  CHORDS_RAW = <<CHORDS_RAW
A         2,1,0,0  2,1,-,-
A         2,1,0,4  2,1,-,4
A         2,4,0,4  1,3,-,4
A 5       2,4,0,0  1,3,-,-
A 7       0,1,0,0  -,1,-,-
A 7       2,4,3,4  1,3,2,4
A sus     2,2,0,0  2,3,-,-
A 7sus    0,2,0,0  -,2,-,-
A 9       2,1,3,2  2,1,4,3
A 9       0,1,0,2  -,1,-,3
A 9       4,1,0,0  4,1,-,-
A aug     2,1,1,0  3,1,2,-
A aug     2,1,1,4  2,1,1,4
A dim7    2,3,2,3  1,3,2,4
A m       2,0,0,0  2,-,-,-
A m       2,0,0,3  2,-,-,4
A m       2,4,0,3  2,4,-,3
A m7      0,0,0,0
A m7      0,0,3,0  -,-,2,-
A m7      2,4,3,3  1,4,2,3
A m7b5    2,3,3,3  1,2,3,4
A maj7    1,1,0,0  1,2,-,-
A maj7    1,1,4,0  1,2,4,-
A maj7    1,1,0,4  1,2,-,4
A maj7    2,4,4,4  1,2,3,4

A#        3,2,1,1  3,2,1,1
A# 7      1,2,1,1  1,2,1,1
A# 7sus   1,3,1,1  1,3,1,1
A# 9      3,2,4,3  2,1,4,3
A# 9      1,2,1,3  1,2,1,4
A# aug    3,2,2,1  4,2,3,1
A# dim    3,1,0,1  4,1,-,2
A# dim    3,1,0,4  3,1,-,4
A# dim    3,4,0,4  1,2,-,3
A# dim7   0,1,0,1  -,1,-,2
A# dim7   3,4,3,4  1,3,2,4
A# m      3,1,1,1  3,1,1,1
A# m      3,1,1,4  3,1,1,4
A# m7     1,1,1,1  1,1,1,1
A# m7b5   1,1,0,1  1,2,-,3
A# m7b5   1,1,0,4  1,2,-,4
A# m7b5   1,4,0,4  1,3,-,4
A# m7b5   3,4,4,4  1,2,3,4
A# maj7   3,2,1,0  3,2,1,-
A# maj7   2,2,1,1  3,4,1,2
A# maj7   2,2,1,0  3,4,1,-
A# sus    3,3,1,1  3,4,1,1

B         4,3,2,2  3,2,1,1
B 7       2,3,2,2  1,2,1,1
B 7       4,3,2,0  3,2,1,-
B 7       2,3,2,0  1,3,2,-
B 7sus    2,4,2,2  1,3,1,1
B 7sus    4,4,2,0  3,4,1,-
B 7sus    4,4,0,0  3,4,-,-
B 7sus    2,4,0,2  1,4,-,2
B 9       2,3,2,4  1,3,2,4
B aug     4,3,3,2  4,2,3,1
B aug     0,3,3,2  -,2,3,1
B dim     4,2,1,2  4,2,1,3
B dim7    1,2,1,2  1,3,2,4
B m       4,2,2,2  3,1,1,1
B m7      2,2,2,2  1,1,1,1
B m7      4,2,2,0  4,1,2,-
B m7b5    2,2,1,2  2,3,1,4
B m7b5    4,2,1,0  4,2,1,-
B m7b5    2,2,1,0  2,3,1,-
B maj7    3,3,2,2  2,3,1,1
B maj7    4,3,2,1  4,3,2,1
B sus     4,4,2,2  3,4,1,1

C         0,0,0,3  -,-,-,3
C         0,4,0,3  -,2,-,1
C         0,4,3,3  -,2,1,1
C 5       0,0,3,3  -,-,1,1
C 7       0,0,0,1  -,-,-,1
C 7       3,4,3,3  1,2,1,1
C 7       3,4,3,1  2,4,3,1
C 7       3,0,0,1  3,-,-,1
C 7sus    0,0,1,1  -,-,1,1
C 7sus    3,0,1,1  3,-,1,1
C 7sus    3,0,1,3  3,-,1,4
C 9       3,0,0,1  3,-,-,1
C 9       0,2,0,1  -,2,-,1
C 9       3,2,0,3  2,1,-,3
C aug     1,0,0,3  1,-,-,3
C aug     1,4,0,3  1,4,-,3
C aug     1,4,4,3  1,3,4,2
C m       0,3,3,3  -,1,1,1
C m7      3,3,3,3  1,1,1,1
C m7      0,3,3,1  -,2,3,1
C m7      3,3,3,1  2,3,4,1
C m7b5    3,3,2,3  2,3,1,4
C m7b5    3,3,2,1  3,4,2,1
C maj7    0,0,0,2  -,-,-,2
C maj7    4,4,3,3  2,3,1,1
C maj7    4,0,0,2  3,-,-,1
C maj7    0,4,0,2  -,3,-,1
C sus     0,0,1,3  -,-,1,3

C#        1,1,1,4  1,1,1,4
C# 5      1,1,4,4  1,1,3,4
C# 7      1,1,1,2  1,1,1,2
C# 7      4,1,1,2  4,1,1,2
C# 7      4,1,1,4  3,1,1,4
C# 7sus   1,1,2,2  1,2,3,4
C# 7sus   4,1,2,2  4,1,3,2
C# 7sus   4,1,2,4  3,1,2,4
C# 9      1,3,1,2  1,3,1,2
C# 9      4,3,1,4  3,2,1,4
C# dim    0,1,0,4  -,1,-,4
C# dim    0,4,0,4  -,3,-,4
C# dim    0,4,3,4  -,3,2,4
C# m      1,1,0,4  1,2,-,4
C# m      1,4,0,4  1,3,-,4
C# m      1,4,4,4  1,4,4,4
C# m7     1,1,0,2  1,2,-,3
C# m7     4,4,4,4  1,1,1,1
C# m7     4,1,0,2  4,1,0,2
C# m7     1,4,0,2  1,4,0,2
C# m7b5   0,1,0,2  -,1,-,3
C# m7b5   4,4,3,4  2,3,1,4
C# m7b5   0,4,3,2  -,3,2,1
C# m7b5   0,4,0,2  -,3,-,1
C# maj7   1,0,1,4  1,-,2,4
C# maj7   1,1,1,3  1,1,1,3
C# maj7   1,0,1,3  1,0,2,4
C# sus    1,1,2,4  1,1,2,4

D         2,2,2,0  1,2,3,-
D 7       2,2,2,3  1,1,1,2
D 7       2,0,2,0  1,-,3,-
D 7       2,0,2,3  1,-,2,3
D 7sus    2,2,3,3  1,2,3,4
D 7sus    0,2,3,3  -,1,2,3
D m       2,2,1,0  2,3,1,-
D m7      2,2,1,3  2,3,1,4
D m7      2,0,1,0  2,-,1,-
D m7      2,0,1,3  2,-,1,4
D m7b5    1,2,1,3  1,2,1,3
D m7b5    1,0,1,3  1,0,2,4
D maj7    2,2,2,4  1,1,1,3
D maj7    2,1,2,4  2,1,3,4
D maj7    2,1,2,0  2,1,3,-
D sus     0,2,3,0  -,2,3,-
D sus     2,2,3,0  1,2,3,-

D#        0,3,3,1  -,3,4,1
D#        3,3,3,1  2,3,4,1
D# 7      3,3,3,4  1,1,1,2
D# 7      0,1,3,1  -,1,3,1
D# 7      3,1,3,1  3,1,4,1
D# 7      0,3,3,4  -,1,1,2
D# 7      3,1,3,4  2,1,3,4
D# 7sus   3,3,4,4  1,2,3,4
D# 9      0,1,1,1  -,1,1,1
D# 9      0,3,1,4  -,2,1,4
D# dim    2,3,2,0  2,1,3,-
D# m      3,3,2,1  3,4,2,1
D# m7     3,3,2,4  2,3,1,4
D# m7b5   2,3,2,4  1,3,2,4
D# sus    1,3,4,1  1,3,4,1
D# sus    3,3,4,1  2,3,4,1

E         1,4,0,2  1,4,-,2
E         1,4,4,2  1,4,3,2
E         4,4,4,2  2,3,4,1
E 5       4,4,0,2  3,4,-,1
E 7       1,2,0,2  1,2,-,3
E 7       1,2,4,2  1,2,4,3
E 7       4,2,4,2  3,1,4,2
E 7sus    2,2,0,2  1,2,-,3
E 7sus    2,2,0,0  2,3,-,-
E 7sus    4,2,0,0  3,1,-,-
E 9       1,2,2,2  1,2,3,4
E 9       1,4,2,2  1,4,2,3
E dim     0,4,0,1  -,4,-,1
E dim     0,4,3,1  -,4,3,1
E dim     3,4,3,1  2,4,3,1
E m       0,4,3,2  -,3,2,1
E m       0,4,0,2  -,3,-,1
E m       4,4,3,2  3,4,2,1
E m7      0,2,0,2  -,2,-,3
E m7      0,2,3,2  -,2,4,3
E m7b5    0,2,0,1  -,2,-,1
E m7b5    0,2,3,1  -,2,3,1
E m7b5    3,2,3,1  3,2,4,1
E maj7    1,3,0,2  1,3,-,2
E maj7    4,3,4,2  3,2,4,1
E maj7    1,3,4,2  1,3,4,2
E sus     2,4,0,2  1,4,-,2
E sus     4,4,0,0  3,4,-,-

F         2,0,1,0  2,-,1,-
F         2,0,1,3  2,-,1,4
F 7       2,3,1,3  2,3,1,4
F 7       2,3,1,0  2,3,1,-
F 7sus    3,3,1,3  2,3,1,4
F 7sus    3,3,1,1  3,4,1,1
F 9       2,3,3,3  1,2,3,4
F 9       0,3,1,0  -,3,1,-
F m       1,0,1,3  1,-,2,4
F m7      1,3,1,3  1,3,1,4
F m7      1,3,4,3  1,2,4,3
F m7b5    1,3,1,2  1,3,1,2
F maj7    2,4,1,3  2,4,1,3
F sus     3,0,1,1  3,-,1,1
F sus     3,0,1,3  3,-,1,4

F#        3,1,2,1  3,1,2,1
F#        3,1,2,4  3,1,2,4
F# 7      3,4,2,4  2,3,1,4
F# 7sus   4,4,2,4  2,3,1,4
F# 7sus   4,4,2,2  3,4,1,1
F# 9      1,1,0,1  1,2,-,3
F# 9      3,4,4,4  1,2,3,4
F# 9      1,4,2,1  1,4,2,1
F# dim    2,0,2,0  1,-,2,-
F# dim    2,0,2,3  1,-,2,4
F# m      2,1,2,0  2,1,3,-
F# m      2,1,2,4  2,1,3,4
F# m7     2,4,2,4  1,3,2,4
F# m7b5   2,4,2,3  1,3,1,2
F# sus    4,1,2,2  4,1,2,3
F# sus    4,1,2,4  3,1,2,4

G         0,2,3,2  -,1,3,2
G         4,2,3,2  3,1,2,1
G 7       0,2,1,2  -,2,1,3
G 7sus    0,2,1,3  -,2,1,3
G 9       2,2,3,2  1,1,2,1
G 9       4,2,3,0  3,1,2,-
G 9       4,2,1,0  4,2,1,-
G dim     0,1,3,1  -,1,3,2
G dim     3,1,3,1  4,1,3,2
G dim     3,1,3,4  2,1,3,4
G m       0,2,3,1  -,2,3,1
G m       3,2,3,1  2,3,4,1
G m7      0,2,1,1  -,2,1,1
G m7b5    0,1,1,1  -,1,1,1
G maj7    0,2,2,2  -,1,1,1
G sus     0,2,3,3  -,1,2,3

G#        1,3,4,3  1,2,4,3
G# 7      1,3,2,3  1,3,2,4
G# 7sus   1,3,2,4  1,3,2,4
G# 9      1,0,2,1  1,-,3,2
G# 9      3,3,4,3  1,1,2,1
G# dim    1,2,4,2  1,2,4,3
G# dim    4,2,4,2  3,1,4,2
G# m      4,3,4,2  3,2,4,1
G# m      1,3,4,2  1,3,4,2
G# m7     1,3,2,2  1,4,2,3
G# m7b5   1,2,2,2  1,2,3,4
G# maj7   0,3,4,3  -,1,3,2
G# maj7   1,3,3,3  1,2,3,4
G# sus    1,3,4,4  1,2,3,4
CHORDS_RAW

  CHORDS = Hash.new { |h, k| h[k] = [] }

  CHORDS_RAW.split($/).delete_if(&:empty?).each do |line|
    chord = Chord.new(line)
    CHORDS[chord.name] << chord

    equivalent = ENHARMONIC_EQUIVALENTS[chord.key]

    if equivalent
      equivalent_line = line.sub(chord.key, equivalent)
      equivalent_chord = Chord.new(equivalent_line)
      CHORDS[equivalent_chord.name] << equivalent_chord
    end
  end
end
