import math
import re

from .வார்ப்புரு import எண்குறிமுறைமை


class இடஞ்சார்(எண்குறிமுறைமை):
    def __init__(தன், பெயர், ஒருங்குறி, குறிகள், பிரிப்பு, அடுக்குக்குறி):
        தன்.குறிகள் = குறிகள்
        தன்.பிரிப்பு = பிரிப்பு
        தன்.அடுக்குக்குறி = அடுக்குக்குறி
        தன்.அடிமானம் = len(குறிகள்)

        super().__init__(பெயர், ஒருங்குறி)

    def எண்ணுக்கு(தன், உரை):
        உரை = உரை.strip('+')
        if any(அடு in உரை for அடு in தன்.அடுக்குக்குறி):
            எண், அடு = re.split(rf'[{தன்.அடுக்குக்குறி}]', உரை)
            return தன்.எண்ணுக்கு(எண்) * தன்.அடிமானம் ** தன்.எண்ணுக்கு(அடு)

        if தன்.அடிமானம் == 10:
            for எ, குறி in enumerate(தன்.குறிகள்):
                உரை = உரை.replace(குறி, str(எ))
            if any(பி in உரை for பி in தன்.பிரிப்பு):
                உரை = re.sub(rf'[{தன்.பிரிப்பு}]', '.', உரை)
                return float(உரை)
            else:
                return int(உரை)
        else:
            அடி = தன்.அடிமானம்

            எண் = 0

            try:
                முழு, தசம = re.split(rf'[{தன்.பிரிப்பு}]', உரை)
            except ValueError:
                முழு = உரை
                தசம = None

            எதிர் = False
            if முழு:
                if முழு[0] == '-':
                    முழு = முழு[1:]
                    எதிர் = True

                for அ in முழு:
                    எண் *= அடி
                    எண் += தன்.குறிகள்.index(அ)

            if தசம:
                த = அடி
                for எ, அ in enumerate(தசம):
                    எண் += தன்.குறிகள்.index(அ) / த
                    எண் = round(எண், எ_சுற்று(1 / த))
                    த *= அடி

            if எதிர்:
                எண் *= -1
            if any(பி in உரை for பி in தன்.பிரிப்பு):
                return float(எண்)
            else:
                return int(எண்)

    def உரைக்கு(தன், எண்):
        if தன்.அடிமானம் == 10:
            உரை = str(எண்)
            if 'e' in உரை:
                உரை = உரை.replace('e', தன்.அடுக்குக்குறி[0])
            for எ, குறி in enumerate(தன்.குறிகள்):
                if str(எ) in உரை:
                    உரை = உரை.replace(str(எ), குறி)
            if '.' in உரை:
                உரை = உரை.replace('.', தன்.பிரிப்பு[0])
        else:
            if எண் == 0:
                return தன்.குறிகள்[0] if isinstance(எண், int) else தன்.குறிகள்[0] + தன்.பிரிப்பு[0]
            அடி = தன்.அடிமானம்

            எதிர் = எண் < 0
            எண் = abs(எண்)
            if isinstance(எண், int):
                முழு = எண்
                தசம = None
            else:
                தசம, முழு = math.modf(எண்)

            if முழு == 0:
                உரை = தன்.குறிகள்[0]
            else:
                உரை = ''
            while முழு:
                உரை = தன்.குறிகள்[int(முழு % அடி)] + உரை
                முழு = int(முழு / அடி)

            if தசம is not None:
                உரை += தன்.பிரிப்பு[0]
                while தசம != 0:
                    சுற்று = எ_சுற்று(தசம)
                    தசம *= அடி
                    உரை += தன்.குறிகள்[int(தசம)]
                    தசம -= int(தசம)
                    தசம = round(தசம, சுற்று)

            if எதிர்:
                உரை = '-' + உரை

        return உரை

    def சுருங்குறித்தொடர்(தன், வடிவம்=None):
        தொடர் = rf'[-+]?(([{தன்.குறிகள்}]+([{தன்.பிரிப்பு}][{தன்.குறிகள்}]*)?)|([{தன்.பிரிப்பு}][{தன்.குறிகள்}]+))'

        return rf'({தொடர்})([{தன்.அடுக்குக்குறி}][-+]?[{தன்.குறிகள்}]+)?'


def எ_சுற்று(எண்):
    உரை = str(எண்)
    if 'e' not in உரை:
        return len(உரை)
    else:
        ச, த = உரை.split('e-')
        return int(த) + len(ச)
