/* Copyright 2016 Sébastien Pérochon
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

#pragma once

#include "keymap.h"

// clang-format off

/*
 * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬─────┐
 * │ @ │ & │ é │ " │ ' │ ( │ § │ è │ ! │ ç │ à │ ) │ - │     │
 * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬───┤
 * │     │ A │ Z │ E │ R │ T │ Y │ U │ I │ O │ P │ ^ │ $ │   │
 * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐  │
 * │      │ Q │ S │ D │ F │ G │ H │ J │ K │ L │ M │ ù │ ` │  │
 * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴──┤
 * │    │ < │ W │ X │ C │ V │ B │ N │ , │ ; │ : │ = │        │
 * ├────┴┬──┴─┬─┴───┼───┴───┴───┴───┴───┴───┼───┴─┬─┴──┬─────┤
 * │     │    │     │                       │     │    │     │
 * └─────┴────┴─────┴───────────────────────┴─────┴────┴─────┘
 */
// Row 1
#define FR_AT   KC_GRV  // @
#define FR_AMPR KC_1    // &
#define FR_LEAC KC_2    // é
#define FR_DQUO KC_3    // "
#define FR_QUOT KC_4    // '
#define FR_LPRN KC_5    // (
#define FR_SECT KC_6    // §
#define FR_LEGR KC_7    // è
#define FR_EXLM KC_8    // !
#define FR_LCCE KC_9    // ç
#define FR_LAGR KC_0    // à
#define FR_RPRN KC_MINS // )
#define FR_MINS KC_EQL  // -
// Row 2
#define FR_A    KC_Q    // A
#define FR_Z    KC_W    // Z
#define FR_E    KC_E    // E
#define FR_R    KC_R    // R
#define FR_T    KC_T    // T
#define FR_Y    KC_Y    // Y
#define FR_U    KC_U    // U
#define FR_I    KC_I    // I
#define FR_O    KC_O    // O
#define FR_P    KC_P    // P
#define FR_CIRC KC_LBRC // ^
#define FR_DLR  KC_RBRC // $
// Row 3
#define FR_Q    KC_A    // Q
#define FR_S    KC_S    // S
#define FR_D    KC_D    // D
#define FR_F    KC_F    // F
#define FR_G    KC_G    // G
#define FR_H    KC_H    // H
#define FR_J    KC_J    // J
#define FR_K    KC_K    // K
#define FR_L    KC_L    // L
#define FR_M    KC_SCLN // M
#define FR_LUGR KC_QUOT // ù
#define FR_GRV  KC_NUHS // `
// Row 4
#define FR_LABK KC_NUBS // <
#define FR_W    KC_Z    // W
#define FR_X    KC_X    // X
#define FR_C    KC_C    // C
#define FR_V    KC_V    // V
#define FR_B    KC_B    // B
#define FR_N    KC_N    // N
#define FR_COMM KC_M    // ,
#define FR_SCLN KC_COMM // ;
#define FR_COLN KC_DOT  // :
#define FR_EQL  KC_SLSH // =

/* Shifted symbols
 * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬─────┐
 * │ # │ 1 │ 2 │ 3 │ 4 │ 5 │ 6 │ 7 │ 8 │ 9 │ 0 │ ° │ _ │     │
 * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬───┤
 * │     │   │   │   │   │   │   │   │   │   │   │ ¨ │ * │   │
 * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐  │
 * │      │   │   │   │   │   │   │   │   │   │   │ % │ £ │  │
 * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴──┤
 * │    │ > │   │   │   │   │   │   │ ? │ . │ / │ + │        │
 * ├────┴┬──┴─┬─┴───┼───┴───┴───┴───┴───┴───┼───┴─┬─┴──┬─────┤
 * │     │    │     │                       │     │    │     │
 * └─────┴────┴─────┴───────────────────────┴─────┴────┴─────┘
 */
// Row 1
#define FR_HASH S(FR_AT)   // #
#define FR_1    S(FR_AMPR) // 1
#define FR_2    S(FR_LEAC) // 2
#define FR_3    S(FR_DQUO) // 3
#define FR_4    S(FR_QUOT) // 4
#define FR_5    S(FR_LPRN) // 5
#define FR_6    S(FR_SECT) // 6
#define FR_7    S(FR_LEGR) // 7
#define FR_8    S(FR_EXLM) // 8
#define FR_9    S(FR_LCCE) // 9
#define FR_0    S(FR_LAGR) // 0
#define FR_DEG  S(FR_RPRN) // °
#define FR_UNDS S(FR_MINS) // _
// Row 2
#define FR_DIAE S(FR_CIRC) // ¨ (dead)
#define FR_ASTR S(FR_DLR)  // *
// Row 3
#define FR_PERC S(FR_LUGR) // %
#define FR_PND  S(FR_GRV)  // £
// Row 4
#define FR_RABK S(FR_LABK) // >
#define FR_QUES S(FR_COMM) // ?
#define FR_DOT  S(FR_SCLN) // .
#define FR_SLSH S(FR_COLN) // /
#define FR_PLUS S(FR_EQL)  // +

/* Alted symbols
 * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬─────┐
 * │ • │  │ ë │ “ │ ‘ │ { │ ¶ │ « │ ¡ │ Ç │ Ø │ } │ — │     │
 * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬───┤
 * │     │ Æ │ Â │ Ê │ ® │ † │ Ú │ º │ î │ Œ │ π │ Ô │ € │   │
 * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐  │
 * │      │ ‡ │ Ò │ ∂ │ ƒ │ fi │ Ì │ Ï │ È │ ¬ │ µ │ Ù │   │  │
 * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴──┤
 * │    │ ≤ │ ‹ │ ≈ │ © │ ◊ │ ß │ ~ │ ∞ │ … │ ÷ │ ≠ │        │
 * ├────┴┬──┴─┬─┴───┼───┴───┴───┴───┴───┴───┼───┴─┬─┴──┬─────┤
 * │     │    │     │                       │     │    │     │
 * └─────┴────┴─────┴───────────────────────┴─────┴────┴─────┘
 */
// Row 1
#define FR_BULT A(FR_AT)   // •
#define FR_APPL A(FR_AMPR) //  (Apple logo)
#define FR_LEDI A(FR_LEAC) // ë
#define FR_LDQU A(FR_DQUO) // “
#define FR_LSQU A(FR_QUOT) // ‘
#define FR_LCBR A(FR_LPRN) // {
#define FR_PILC A(FR_SECT) // ¶
#define FR_LDAQ A(FR_LEGR) // «
#define FR_IEXL A(FR_EXLM) // ¡
#define FR_CCCE A(FR_LCCE) // Ç
#define FR_OSTR A(FR_LAGR) // Ø
#define FR_RCBR A(FR_RPRN) // }
#define FR_MDSH A(FR_MINS) // —
// Row 2
#define FR_AE   A(FR_A)    // Æ
#define FR_CACI A(FR_Z)    // Â
#define FR_ECIR A(FR_E)    // Ê
#define FR_REGD A(FR_R)    // ®
#define FR_DAGG A(FR_T)    // †
#define FR_CUAC A(FR_Y)    // Ú
#define FR_MORD A(FR_U)    // º
#define FR_LICI A(FR_I)    // î
#define FR_OE   A(FR_O)    // Œ
#define FR_PI   A(FR_P)    // π
#define FR_OCIR A(FR_CIRC) // Ô
#define FR_EURO A(FR_DLR)  // €
// Row 3
#define FR_DDAG A(FR_Q)    // ‡
#define FR_COGR A(FR_S)    // Ò
#define FR_PDIF A(FR_D)    // ∂
#define FR_FHK  A(FR_F)    // ƒ
#define FR_FI   A(FR_G)    // fi
#define FR_CIGR A(FR_H)    // Ì
#define FR_CIDI A(FR_J)    // Ï
#define FR_CEGR A(FR_K)    // È
#define FR_NOT  A(FR_L)    // ¬
#define FR_MICR A(FR_M)    // µ
#define FR_CUGR A(FR_LUGR) // Ù
// Row 4
#define FR_LTEQ A(FR_LABK) // ≤
#define FR_LSAQ A(FR_W)    // ‹
#define FR_AEQL A(FR_X)    // ≈
#define FR_COPY A(FR_C)    // ©
#define FR_LOZN A(FR_V)    // ◊
#define FR_SS   A(FR_B)    // ß
#define FR_TILD A(FR_N)    // ~ (dead)
#define FR_INFN A(FR_COMM) // ∞
#define FR_ELLP A(FR_SCLN) // …
#define FR_DIV  A(FR_COLN) // ÷
#define FR_NEQL A(FR_EQL)  // ≠

/* Shift+Alted symbols
 * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬─────┐
 * │ Ÿ │ ´ │ „ │   │   │ [ │ å │ » │ Û │ Á │   │ ] │ – │     │
 * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬───┤
 * │     │   │ Å │   │ ‚ │ ™ │   │ ª │ ï │   │ ∏ │   │ ¥ │   │
 * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┐  │
 * │      │ Ω │ ∑ │ ∆ │ · │ fl │ Î │ Í │ Ë │ | │ Ó │ ‰ │   │  │
 * ├────┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴──┤
 * │    │ ≥ │ › │ ⁄ │ ¢ │ √ │ ∫ │ ı │ ¿ │   │ \ │ ± │        │
 * ├────┴┬──┴─┬─┴───┼───┴───┴───┴───┴───┴───┼───┴─┬─┴──┬─────┤
 * │     │    │     │                       │     │    │     │
 * └─────┴────┴─────┴───────────────────────┴─────┴────┴─────┘
 */
// Row 1
#define FR_CYDI S(A(FR_AT))   // Ÿ
#define FR_ACUT S(A(FR_AMPR)) // ´ (dead)
#define FR_DLQU S(A(FR_LEAC)) // „
#define FR_LBRC S(A(FR_LPRN)) // [
#define FR_LARI S(A(FR_SECT)) // å
#define FR_RDAQ S(A(FR_LEGR)) // »
#define FR_CUCI S(A(FR_EXLM)) // Û
#define FR_CAAC S(A(FR_LCCE)) // Á
#define FR_RBRC S(A(FR_RPRN)) // ]
#define FR_NDSH S(A(FR_MINS)) // –
// Row 2
#define FR_CARI S(A(FR_Z))    // Å
#define FR_SLQU S(A(FR_R))    // ‚
#define FR_TM   S(A(FR_T))    // ™
#define FR_FORD S(A(FR_U))    // ª
#define FR_LIDI S(A(FR_I))    // ï
#define FR_NARP S(A(FR_P))    // ∏
#define FR_YEN  S(A(FR_DLR))  // ¥
// Row 3
#define FR_OMEG S(A(FR_Q))    // Ω
#define FR_NARS S(A(FR_S))    // ∑
#define FR_INCR S(A(FR_D))    // ∆
#define FR_MDDT S(A(FR_F))    // ·
#define FR_FL   S(A(FR_G))    // fl
#define FR_CICI S(A(FR_H))    // Î
#define FR_CIAC S(A(FR_J))    // Í
#define FR_CEDI S(A(FR_K))    // Ë
#define FR_PIPE S(A(FR_L))    // |
#define FR_COAC S(A(FR_M))    // Ó
#define FR_PERM S(A(FR_LUGR)) // ‰
// Row 4
#define FR_GTEQ S(A(FR_LABK)) // ≥
#define FR_RSAQ S(A(FR_W))    // ›
#define FR_FRSL S(A(FR_X))    // ⁄
#define FR_CENT S(A(FR_C))    // ¢
#define FR_SQRT S(A(FR_V))    // √
#define FR_INTG S(A(FR_B))    // ∫
#define FR_DLSI S(A(FR_N))    // ı
#define FR_IQUE S(A(FR_COMM)) // ¿
#define FR_BSLS S(A(FR_COLN)) // (backslash)
#define FR_PLMN S(A(FR_EQL))  // ±

// DEPRECATED
#define FR_AMP  FR_AMPR
#define FR_EACU FR_LEAC
#define FR_APOS FR_QUOT
#define FR_EGRV FR_LEGR
#define FR_CCED FR_LCCE
#define FR_AGRV FR_LAGR
#define FR_UGRV FR_LUGR
#define FR_LESS FR_LABK
#define FR_UMLT FR_DIAE
#define FR_GRTR FR_RABK