# -*- coding: utf-8 -*-
from ppms.migration import MigratePythonPacket, SQLPacket, PacketCategory, MaxVersionDependency, VersionType


class FixColumnTypeUUID(MigratePythonPacket):
    """Fix column type "UUID" in the data dictionary not setting field type etc."""
    version = 1
    run_on_startup = True
    done_after_success = True
    category = PacketCategory.CATEGORY_MANDATORY
    wi_number = 13226

    def get_dependencies(self):
        return (MaxVersionDependency(version='39.4', version_type=VersionType.CUSTOMIZING),)

    def fix(self, runner):
        valueranges = {"000244": ("4b9d4816786ec224f82f55ad03c24154",
                                  "39dbfb619e2686f9b1e5d4782e84e94c",
                                  '''"A","AL","ALG","AR","ARG","N","T","T2","U","Y",
"O","P","C","AM","AP","I"," "'''),
                       "041246": ("2d672190b657976443588ab66a08592c",
                                  "7379270366909c59327faecb45204533",
                                  '''from ppms import ppms_cu

def processInput(di, oldvalue):

    column_type = di
    rec = di.get_dtp_record()

    db_length = rec.db_length
    df_length = rec.df_length

    db_typ = rec.db_typ
    df_typ = rec.df_type
    ppms_type = rec.ppms_type

    di_class = rec.di_class
    sql_defaultvalue = rec.sql_defaultvalue

    # mash 14.01.2011: Commented due to bug
    # di = rec.get_di("db_position")
    # new_pos = ppms_cu.Action.create_DbPos(di)
    # rec.db_position.set_string_value(new_pos)


    column_type_value=str(column_type.get_value())

    #Alpha
    if column_type_value == "5":
        db_typ.set_string_value("X")
        df_typ.set_string_value("AL")
        ppms_type.set_string_value("AL")
        # Fixes class field being empty when you copy
        if di_class.get_tech_value() != 13:
            di_class.set_string_value("")
    #Alpha, gross
    elif column_type_value == "6":
        db_typ.set_string_value("X")
        df_typ.set_string_value("ALG")
        ppms_type.set_string_value("ALG")
        di_class.set_string_value("")
    #Balken
    elif column_type_value == "320":
        db_typ.set_string_value("")
        df_typ.set_string_value("")
        ppms_type.set_string_value("-")
        di_class.set_string_value("1")
    #Email
    elif column_type_value == "9":
        db_typ.set_string_value("X")
        df_typ.set_string_value("AM")
        ppms_type.set_string_value("AM")
        di_class.set_string_value("")
    #Telephone
    elif column_type_value == "10":
        db_typ.set_string_value("X")
        df_typ.set_string_value("AP")
        ppms_type.set_string_value("AP")
        di_class.set_string_value("")
    #Currency
    elif column_type_value == "14":
        db_typ.set_string_value("N8")
        df_typ.set_string_value("C")
        ppms_type.set_string_value("C")
        di_class.set_string_value("")
    #Date
    elif column_type_value == "15":
        db_typ.set_string_value("N4")
        df_typ.set_string_value("T")
        ppms_type.set_string_value("D")
        db_length.set_string_value("4")
        df_length.set_string_value("8")
        sql_defaultvalue.set_string_value("01.01.70")
        di_class.set_string_value("")
    #Hyperlink (linked file)
    elif column_type_value == "16":
        db_typ.set_string_value("X")
        df_typ.set_string_value("AL")
        ppms_type.set_string_value("HL")
        di_class.set_string_value("16")
    #Hyperlink (Local file)
    elif column_type_value == "281":
        db_typ.set_string_value("X")
        df_typ.set_string_value("AL")
        ppms_type.set_string_value("HL")
        di_class.set_string_value("16")
    #Hyperlink (File in DB)
    elif column_type_value == "282":
        db_typ.set_string_value("X")
        df_typ.set_string_value("AL")
        ppms_type.set_string_value("HL")
        di_class.set_string_value("16")
    #I-Text
    elif column_type_value == "17":
        db_typ.set_string_value("X")
        df_typ.set_string_value("AL")
        ppms_type.set_string_value("IT")
        di_class.set_string_value("15")
    #I-Text, capital
    elif column_type_value == "18":
        db_typ.set_string_value("X")
        df_typ.set_string_value("AL")
        ppms_type.set_string_value("ITG")
        di_class.set_string_value("15")
    #Relations
    elif column_type_value == "19":
        db_typ.set_string_value("N2")
        df_typ.set_string_value("P")
        ppms_type.set_string_value("L")
        di_class.set_string_value("")
    #Number (2)
    elif column_type_value == "20":
        db_typ.set_string_value("N2")
        df_typ.set_string_value("N")
        ppms_type.set_string_value("N2")
        di_class.set_string_value("")
    #Number (4)
    elif column_type_value == "21":
        db_typ.set_string_value("N4")
        df_typ.set_string_value("N")
        ppms_type.set_string_value("N4")
        di_class.set_string_value("")
    #Number (8)
    elif column_type_value == "22":
        db_typ.set_string_value("N8")
        df_typ.set_string_value("N")
        ppms_type.set_string_value("N8")
        di_class.set_string_value("")
    #Time
    elif column_type_value == "24":
        db_typ.set_string_value("N4")
        df_typ.set_string_value("U")
        ppms_type.set_string_value("T")
        di_class.set_string_value("")
    #Boolean
    elif column_type_value == "26":
        db_typ.set_string_value("N2")
        df_typ.set_string_value("Y")
        ppms_type.set_string_value("Y")
        db_length.set_string_value("2")
        df_length.set_string_value("1")
        sql_defaultvalue.set_string_value("0")
        di_class.set_string_value("")
    #Clob test
    elif column_type_value == "27":
        db_typ.set_string_value("X")
        df_typ.set_string_value("AL")
        ppms_type.set_string_value("CLOB")
        di_class.set_string_value("19")
        rec.db_length.set_value(3000)
        rec.df_length.set_value(3000)
    #object protection
    elif column_type_value == "278":
        db_typ.set_string_value("N2")
        df_typ.set_string_value("O")
        ppms_type.set_string_value("O")
        rec.status.set_value(6)
        rec.db_length.set_value(2)
        rec.df_length.set_value(4)
    #incarnation or bars
    elif column_type_value == "305":
        ppms_type.set_string_value("")
        db_typ.set_string_value("")
        df_typ.set_string_value("")
    # uuid
    elif column_type_value == '321':
        rec.db_position.set_value(0)
        db_length.set_value(16)
        db_typ.set_string_value("ID")
        df_typ.set_string_value("I")
        df_length.set_value(36)
        di_class.set_value(0)
        rec.column_name.set_string_value("UUID")
        ppms_type.set_string_value("UUID")
        rec.di_name.set_string_value("UUID")
        rec.df_behavior.set_string_value("o")
        rec.virtual.set_value(0)
        rec.wb_type.set_string_value("")
        cu_name = rec.di_customizing_name.get_value()
        if not cu_name:
            rec.di_customizing_name.set_string_value("uuid")

    return rec.column_type.get_value() or ''

processInput.deps=("DI000215", "DI000241", "DI000244", "DI000246", "DI000253", "DI000254", "DI000275", "DI001437",\
 "DI001591", "DI001700", "DI001990", "DI003141", "DI026799", "DI041035", "DI041246")''')}

        failures = 0

        for dataitem, (old_hash, new_hash, new_code) in valueranges.items():
            fix_func = lambda old_code: new_code

            if not self.migrate_python(old_hash, new_hash, self.CU_TYPE_DATAITEM, dataitem, fix_func):
                failures += 1

        if not failures:
            return self.success()
        return self.fail('Migrating the valuerange failed!')


class AddPPMSTypeUUID(SQLPacket):
    """Add PPMS type "UUID" to DT407"""
    version = 1
    run_on_startup = True
    done_after_success = True
    category = PacketCategory.CATEGORY_MANDATORY
    wi_number = 13226

    def get_dependencies(self):
        return (MaxVersionDependency(version='39.4', version_type=VersionType.CUSTOMIZING),)

    sql_file = "WI13226_add_ppms_type_uuid.sql"

    def fix(self, runner):
        self.apply_dml_file(self.sql_planta_de_dbms, self.sql_file)

        return self.success()