# coding=utf-8
#
# Copyright (C) 2007 Martin Owens
#
# 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, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
#
"""
Python barcode renderer for RM4CC barcodes. Designed for use with Inkscape.
"""

from .Base import Barcode

charmap = {
    "(": "25",
    ")": "3",
    "0": "05053535",
    "1": "05152535",
    "2": "05153525",
    "3": "15052535",
    "4": "15053525",
    "5": "15152525",
    "6": "05251535",
    "7": "05350535",
    "8": "05351525",
    "9": "15250535",
    "A": "15251525",
    "B": "15350525",
    "C": "05253515",
    "D": "05352515",
    "E": "05353505",
    "F": "15252515",
    "G": "15253505",
    "H": "15352505",
    "I": "25051535",
    "J": "25150535",
    "K": "25151525",
    "L": "35050535",
    "M": "35051525",
    "N": "35150525",
    "O": "25053525",
    "P": "25152515",
    "Q": "25153505",
    "R": "35052515",
    "S": "35053505",
    "T": "35152505",
    "U": "25251515",
    "V": "25350515",
    "W": "25351505",
    "X": "35250515",
    "Y": "35251505",
    "Z": "35350505",
}

check = ["ZUVWXY", "501234", "B6789A", "HCDEFG", "NIJKLM", "TOPQRS"]
(BAR_TRACK, BAR_DOWN, BAR_UP, BAR_FULL, BAR_NONE, WHITE_SPACE) = range(6)


class Rm4scc(Barcode):
    """Provice a Rm4scc barcode generator"""

    default_height = 18

    def encode(self, text):
        result = ""

        text = text.upper()
        text.replace("(", "")
        text.replace(")", "")

        text = "(" + text + Rm4scc.checksum(text) + ")"

        i = 0
        for char in text:
            if char in charmap:
                result = result + charmap[char]
                i += 1

        return result

    @staticmethod
    def checksum(text):
        """given a string of data, return the check character"""
        total_lower = 0
        total_upper = 0
        for char in text:
            if char in charmap:
                bars = charmap[char][0:8:2]
                lower = 0
                upper = 0

                if int(bars[0]) & 1:
                    lower += 4
                if int(bars[1]) & 1:
                    lower += 2
                if int(bars[2]) & 1:
                    lower += 1
                if int(bars[0]) & 2:
                    upper += 4
                if int(bars[1]) & 2:
                    upper += 2
                if int(bars[2]) & 2:
                    upper += 1
            total_lower += lower % 6
            total_upper += upper % 6

        total_lower = total_upper % 6
        total_upper %= 6

        checkchar = check[total_upper][total_lower]
        return checkchar

    def get_style(self, index):
        """Royal Mail Barcodes use a completely different style"""
        result = {"width": 2, "write": True, "top": 0}
        if index == BAR_TRACK:  # Track Bar
            result["top"] = 6
            result["height"] = 5
        elif index == BAR_DOWN:  # Decender Bar
            result["top"] = 6
            result["height"] = 11
        elif index == BAR_UP:  # Accender Bar
            result["height"] = 11
        elif index == BAR_FULL:  # Full Bar
            result["height"] = 17
        elif index == WHITE_SPACE:  # White Space
            result["write"] = False
        return result
