"""Information that should be available to the python library.
"""
from os import environ
from datetime import date
from pathlib import Path

from qmk.userspace import detect_qmk_userspace

# The root of the qmk_firmware tree.
QMK_FIRMWARE = Path.cwd()

# The detected userspace tree
QMK_USERSPACE = detect_qmk_userspace()

# Whether or not we have a separate userspace directory
HAS_QMK_USERSPACE = True if QMK_USERSPACE is not None else False

# Upstream repo url
QMK_FIRMWARE_UPSTREAM = 'qmk/qmk_firmware'

# This is the number of directories under `qmk_firmware/keyboards` that will be traversed. This is currently a limitation of our make system.
MAX_KEYBOARD_SUBFOLDERS = 5

# Supported processor types
CHIBIOS_PROCESSORS = 'cortex-m0', 'cortex-m0plus', 'cortex-m3', 'cortex-m4', 'MKL26Z64', 'MK20DX128', 'MK20DX256', 'MK64FX512', 'MK66FX1M0', 'RP2040', 'STM32F042', 'STM32F072', 'STM32F103', 'STM32F303', 'STM32F401', 'STM32F405', 'STM32F407', 'STM32F411', 'STM32F446', 'STM32G431', 'STM32G474', 'STM32H723', 'STM32H733', 'STM32L412', 'STM32L422', 'STM32L432', 'STM32L433', 'STM32L442', 'STM32L443', 'GD32VF103', 'WB32F3G71', 'WB32FQ95'
LUFA_PROCESSORS = 'at90usb162', 'atmega16u2', 'atmega32u2', 'atmega16u4', 'atmega32u4', 'at90usb646', 'at90usb647', 'at90usb1286', 'at90usb1287', None
VUSB_PROCESSORS = 'atmega32a', 'atmega328p', 'atmega328', 'attiny85'

# Bootloaders of the supported processors
MCU2BOOTLOADER = {
    "RP2040": "rp2040",
    "MKL26Z64": "halfkay",
    "MK20DX128": "halfkay",
    "MK20DX256": "halfkay",
    "MK66FX1M0": "halfkay",
    "STM32F042": "stm32-dfu",
    "STM32F072": "stm32-dfu",
    "STM32F103": "stm32duino",
    "STM32F303": "stm32-dfu",
    "STM32F401": "stm32-dfu",
    "STM32F405": "stm32-dfu",
    "STM32F407": "stm32-dfu",
    "STM32F411": "stm32-dfu",
    "STM32F446": "stm32-dfu",
    "STM32G431": "stm32-dfu",
    "STM32G474": "stm32-dfu",
    "STM32H723": "stm32-dfu",
    "STM32H733": "stm32-dfu",
    "STM32L412": "stm32-dfu",
    "STM32L422": "stm32-dfu",
    "STM32L432": "stm32-dfu",
    "STM32L433": "stm32-dfu",
    "STM32L442": "stm32-dfu",
    "STM32L443": "stm32-dfu",
    "GD32VF103": "gd32v-dfu",
    "WB32F3G71": "wb32-dfu",
    "WB32FQ95": "wb32-dfu",
    "atmega16u2": "atmel-dfu",
    "atmega32u2": "atmel-dfu",
    "atmega16u4": "atmel-dfu",
    "atmega32u4": "atmel-dfu",
    "at90usb162": "atmel-dfu",
    "at90usb646": "atmel-dfu",
    "at90usb647": "atmel-dfu",
    "at90usb1286": "atmel-dfu",
    "at90usb1287": "atmel-dfu",
    "atmega32a": "bootloadhid",
    "atmega328p": "usbasploader",
    "atmega328": "usbasploader",
}

# Map of legacy keycodes that can be automatically updated
LEGACY_KEYCODES = {  # Comment here is to force multiline formatting
    'RESET': 'QK_BOOT'
}

# Map VID:PID values to bootloaders
BOOTLOADER_VIDS_PIDS = {
    'atmel-dfu': {
        ("03eb", "2fef"),  # ATmega16U2
        ("03eb", "2ff0"),  # ATmega32U2
        ("03eb", "2ff3"),  # ATmega16U4
        ("03eb", "2ff4"),  # ATmega32U4
        ("03eb", "2ff9"),  # AT90USB64
        ("03eb", "2ffa"),  # AT90USB162
        ("03eb", "2ffb")  # AT90USB128
    },
    'kiibohd': {("1c11", "b007")},
    'stm32-dfu': {
        ("1eaf", "0003"),  # STM32duino
        ("0483", "df11")  # STM32 DFU
    },
    'apm32-dfu': {("314b", "0106")},
    'gd32v-dfu': {("28e9", "0189")},
    'wb32-dfu': {("342d", "dfa0")},
    'bootloadhid': {("16c0", "05df")},
    'usbasploader': {("16c0", "05dc")},
    'usbtinyisp': {("1782", "0c9f")},
    'md-boot': {("03eb", "6124")},
    'caterina': {
        # pid.codes shared PID
        ("1209", "2302"),  # Keyboardio Atreus 2 Bootloader
        # Spark Fun Electronics
        ("1b4f", "9203"),  # Pro Micro 3V3/8MHz
        ("1b4f", "9205"),  # Pro Micro 5V/16MHz
        ("1b4f", "9207"),  # LilyPad 3V3/8MHz (and some Pro Micro clones)
        # Pololu Electronics
        ("1ffb", "0101"),  # A-Star 32U4
        # Arduino SA
        ("2341", "0036"),  # Leonardo
        ("2341", "0037"),  # Micro
        # Adafruit Industries LLC
        ("239a", "000c"),  # Feather 32U4
        ("239a", "000d"),  # ItsyBitsy 32U4 3V3/8MHz
        ("239a", "000e"),  # ItsyBitsy 32U4 5V/16MHz
        # dog hunter AG
        ("2a03", "0036"),  # Leonardo
        ("2a03", "0037")  # Micro
    },
    'hid-bootloader': {
        ("03eb", "2067"),  # QMK HID
        ("16c0", "0478")  # PJRC halfkay
    }
}

# Common format strings
DATE_FORMAT = '%Y-%m-%d'
DATETIME_FORMAT = '%Y-%m-%d %H:%M:%S %Z'
TIME_FORMAT = '%H:%M:%S'

# Used when generating matrix locations
COL_LETTERS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijilmnopqrstuvwxyz'
ROW_LETTERS = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnop'

# Constants that should match their counterparts in make
BUILD_DIR = environ.get('BUILD_DIR', '.build')
INTERMEDIATE_OUTPUT_PREFIX = f'{BUILD_DIR}/obj_'

# Headers for generated files
GPL2_HEADER_C_LIKE = f'''\
// Copyright {date.today().year} QMK
// SPDX-License-Identifier: GPL-2.0-or-later
'''

GPL2_HEADER_SH_LIKE = f'''\
# Copyright {date.today().year} QMK
# SPDX-License-Identifier: GPL-2.0-or-later
'''

GENERATED_HEADER_C_LIKE = '''\
/*******************************************************************************
  88888888888 888      d8b                .d888 d8b 888               d8b
      888     888      Y8P               d88P"  Y8P 888               Y8P
      888     888                        888        888
      888     88888b.  888 .d8888b       888888 888 888  .d88b.       888 .d8888b
      888     888 "88b 888 88K           888    888 888 d8P  Y8b      888 88K
      888     888  888 888 "Y8888b.      888    888 888 88888888      888 "Y8888b.
      888     888  888 888      X88      888    888 888 Y8b.          888      X88
      888     888  888 888  88888P'      888    888 888  "Y8888       888  88888P'
                                                        888                 888
                                                        888                 888
                                                        888                 888
     .d88b.   .d88b.  88888b.   .d88b.  888d888 8888b.  888888 .d88b.   .d88888
    d88P"88b d8P  Y8b 888 "88b d8P  Y8b 888P"      "88b 888   d8P  Y8b d88" 888
    888  888 88888888 888  888 88888888 888    .d888888 888   88888888 888  888
    Y88b 888 Y8b.     888  888 Y8b.     888    888  888 Y88b. Y8b.     Y88b 888
     "Y88888  "Y8888  888  888  "Y8888  888    "Y888888  "Y888 "Y8888   "Y88888
         888
    Y8b d88P
     "Y88P"
*******************************************************************************/
'''

GENERATED_HEADER_SH_LIKE = '''\
################################################################################
#
# 88888888888 888      d8b                .d888 d8b 888               d8b
#     888     888      Y8P               d88P"  Y8P 888               Y8P
#     888     888                        888        888
#     888     88888b.  888 .d8888b       888888 888 888  .d88b.       888 .d8888b
#     888     888 "88b 888 88K           888    888 888 d8P  Y8b      888 88K
#     888     888  888 888 "Y8888b.      888    888 888 88888888      888 "Y8888b.
#     888     888  888 888      X88      888    888 888 Y8b.          888      X88
#     888     888  888 888  88888P'      888    888 888  "Y8888       888  88888P'
#
#                                                       888                 888
#                                                       888                 888
#                                                       888                 888
#    .d88b.   .d88b.  88888b.   .d88b.  888d888 8888b.  888888 .d88b.   .d88888
#   d88P"88b d8P  Y8b 888 "88b d8P  Y8b 888P"      "88b 888   d8P  Y8b d88" 888
#   888  888 88888888 888  888 88888888 888    .d888888 888   88888888 888  888
#   Y88b 888 Y8b.     888  888 Y8b.     888    888  888 Y88b. Y8b.     Y88b 888
#    "Y88888  "Y8888  888  888  "Y8888  888    "Y888888  "Y888 "Y8888   "Y88888
#        888
#   Y8b d88P
#    "Y88P"
#
################################################################################
'''

LICENSE_TEXTS = [
    (
        'GPL-2.0-or-later', [
            """\
        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 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 any later version.
        """
        ]
    ),
    ('GPL-2.0-only', ["""\
        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; version 2.
        """]),
    (
        'GPL-3.0-or-later', [
            """\
        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 3 of
        the License, or (at your option) any later version.
        """, """\
        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 3 of
        the License, or any later version.
        """
        ]
    ),
    ('GPL-3.0-only', ["""\
        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, version 3.
        """]),
    (
        'LGPL-2.1-or-later', [
            """\
        This program is free software; you can redistribute it and/or
        modify it under the terms of the GNU Lesser General Public License
        as published by the Free Software Foundation; either version 2.1
        of the License, or (at your option) any later version.
        """, """\
        This program is free software; you can redistribute it and/or
        modify it under the terms of the GNU Lesser General Public License
        as published by the Free Software Foundation; either version 2.1
        of the License, or any later version.
        """, """\
        This library is free software; you can redistribute it and/or
        modify it under the terms of the GNU Lesser General Public License
        as published by the Free Software Foundation; either version 2.1
        of the License, or (at your option) any later version.
        """, """\
        This library is free software; you can redistribute it and/or
        modify it under the terms of the GNU Lesser General Public License
        as published by the Free Software Foundation; either version 2.1
        of the License, or any later version.
        """
        ]
    ),
    (
        'LGPL-2.1-only', [
            """\
        This program is free software; you can redistribute it and/or
        modify it under the terms of the GNU Lesser General Public License as
        published by the Free Software Foundation; version 2.1.
        """, """\
        This library is free software; you can redistribute it and/or
        modify it under the terms of the GNU Lesser General Public License as
        published by the Free Software Foundation; version 2.1.
        """
        ]
    ),
    (
        'LGPL-3.0-or-later', [
            """\
        This program is free software; you can redistribute it and/or
        modify it under the terms of the GNU Lesser General Public License
        as published by the Free Software Foundation; either version 3
        of the License, or (at your option) any later version.
        """, """\
        This program is free software; you can redistribute it and/or
        modify it under the terms of the GNU Lesser General Public License
        as published by the Free Software Foundation; either version 3
        of the License, or any later version.
        """, """\
        This library is free software; you can redistribute it and/or
        modify it under the terms of the GNU Lesser General Public License
        as published by the Free Software Foundation; either version 3
        of the License, or (at your option) any later version.
        """, """\
        This library is free software; you can redistribute it and/or
        modify it under the terms of the GNU Lesser General Public License
        as published by the Free Software Foundation; either version 3
        of the License, or any later version.
        """
        ]
    ),
    (
        'LGPL-3.0-only', [
            """\
        This program is free software; you can redistribute it and/or
        modify it under the terms of the GNU Lesser General Public License as
        published by the Free Software Foundation; version 3.
        """, """\
        This library is free software; you can redistribute it and/or
        modify it under the terms of the GNU Lesser General Public License as
        published by the Free Software Foundation; version 3.
        """
        ]
    ),
    ('Apache-2.0', ["""\
        Licensed under the Apache License, Version 2.0 (the "License");
        you may not use this file except in compliance with the License.
        """]),
]
