from datetime import datetime
from pg_cnab240.segment_section import SegmentSection
from pg_cnab240.banks.itau.segments.headers.transfer_header import TransferHeader
from pg_cnab240.banks.itau.segments.footers.transfer_footer import TransferFooter


class SegmentA(SegmentSection):
    def __init__(self, data=None):
        super().__init__('SegmentA', data, {
            'bank_code': {
                'type': 'int',
                'length': 3,
                'default': 341,
                'pad_content': 0,
                'pad_direction': 'left',
                'required': True,
                'start': 0,
                'end': 3,
                'value': None,
            },
            'lot_code': {
                'type': 'int',
                'length': 4,
                'default': 0000,
                'pad_content': 0,
                'pad_direction': 'left',
                'required': False,
                'start': 3,
                'end': 7,
                'value': None,
            },
            'register_type': {
                'type': 'int',
                'length': 1,
                'default': 3,
                'pad_content': 0,
                'pad_direction': 'left',
                'required': False,
                'start': 7,
                'end': 8,
                'value': None,
            },
            'register_number': {
                'type': 'int',
                'length': 5,
                'default': 0,
                'pad_content': 0,
                'pad_direction': 'left',
                'required': True,
                'start': 8,
                'end': 13,
                'value': None,
            },
            'segment': {
                'type': 'string',
                'length': 1,
                'default': 'A',
                'pad_content': ' ',
                'pad_direction': 'left',
                'required': False,
                'start': 13,
                'end': 14,
                'value': None,
            },
            'move_type': {
                'type': 'int',
                'length': 3,
                'default': '000',
                'pad_content': 0,
                'pad_direction': 'left',
                'required': False,
                'start': 14,
                'end': 17,
                'value': None,
            },
            'assembly': {
                'type': 'int',
                'length': 3,
                'default': 0,
                'pad_content': 0,
                'pad_direction': 'left',
                'required': False,
                'start': 17,
                'end': 20,
                'value': None,
            },
            'favored_bank': {
                'type': 'int',
                'length': 3,
                'default': 0,
                'pad_content': 0,
                'pad_direction': 'left',
                'required': True,
                'start': 20,
                'end': 23,
                'value': None,
            },
            'agency_account_digit': {
                'type': 'string',
                'length': 20,
                'default': '',
                'pad_content': ' ',
                'pad_direction': 'right',
                'required': True,
                'start': 23,
                'end': 43,
                'value': None,
            },
            'favored_name': {
                'type': 'string',
                'length': 30,
                'default': '',
                'pad_content': ' ',
                'pad_direction': 'right',
                'required': True,
                'start': 43,
                'end': 73,
                'value': None,
            },
            'your_number': {
                'type': 'string',
                'length': 20,
                'default': '',
                'pad_content': ' ',
                'pad_direction': 'right',
                'required': True,
                'start': 73,
                'end': 93,
                'value': None,
            },
            'pay_date': {
                'type': 'date',
                'length': 8,
                'default': '',
                'pad_content': ' ',
                'pad_direction': 'right',
                'required': True,
                'start': 93,
                'end': 101,
                'value': None,
            },
            'currency_type': {
                'type': 'string',
                'length': 3,
                'default': 'REA',
                'pad_content': 0,
                'pad_direction': 'left',
                'required': False,
                'start': 101,
                'end': 104,
                'value': None,
            },
            'ispb_code': {
                'type': 'int',
                'length': 8,
                'default': 0,
                'pad_content': 0,
                'pad_direction': 'left',
                'required': True,
                'start': 104,
                'end': 112,
                'value': None,
            },
            'ispb_zeros': {
                'type': 'int',
                'length': 7,
                'default': 0,
                'pad_content': 0,
                'pad_direction': 'left',
                'required': False,
                'start': 112,
                'end': 119,
                'value': None,
            },
            'payment_amount': {
                'type': 'float',
                'length': 15,
                'default': 0,
                'pad_content': 0,
                'pad_direction': 'left',
                'required': True,
                'start': 119,
                'end': 134,
                'value': None,
            },
            'our_number': {
                'type': 'string',
                'length': 15,
                'default': '',
                'pad_content': ' ',
                'pad_direction': 'right',
                'required': False,
                'start': 134,
                'end': 149,
                'value': None,
            },
            'our_number_whites': {
                'type': 'whites',
                'length': 5,
                'default': '',
                'pad_content': ' ',
                'pad_direction': 'right',
                'required': False,
                'start': 149,
                'end': 154,
                'value': None,
            },
            'effective_pay_date': {
                'type': 'date',
                'length': 8,
                'default': '',
                'pad_content': ' ',
                'pad_direction': 'right',
                'required': False,
                'start': 154,
                'end': 162,
                'value': None,
            },
            'effective_paid_amount': {
                'type': 'float',
                'length': 15,
                'default': 0,
                'pad_content': 0,
                'pad_direction': 'left',
                'required': False,
                'start': 162,
                'end': 177,
                'value': None,
            },
            'goal_detail': {
                'type': 'string',
                'length': 18,
                'default': '',
                'pad_content': ' ',
                'pad_direction': 'right',
                'required': True,
                'start': 177,
                'end': 195,
                'value': None,
            },
            'goal_whites': {
                'type': 'whites',
                'length': 2,
                'default': '',
                'pad_content': ' ',
                'pad_direction': 'right',
                'required': False,
                'start': 195,
                'end': 197,
                'value': None,
            },
            'payment_document_number': {
                'type': 'int',
                'length': 6,
                'default': 0,
                'pad_content': 0,
                'pad_direction': 'left',
                'required': False,
                'start': 197,
                'end': 203,
                'value': None,
            },
            'favored_document_number': {
                'type': 'int',
                'length': 14,
                'default': 0,
                'pad_content': 0,
                'pad_direction': 'left',
                'required': True,
                'start': 203,
                'end': 217,
                'value': None,
            },
            'doc_goal': {
                'type': 'string',
                'length': 2,
                'default': '',
                'pad_content': ' ',
                'pad_direction': 'right',
                'required': False,
                'start': 217,
                'end': 219,
                'value': None,
            },
            'ted_goal': {
                'type': 'string',
                'length': 5,
                'default': '',
                'pad_content': ' ',
                'pad_direction': 'right',
                'required': False,
                'start': 219,
                'end': 224,
                'value': None,
            },
            'ted_whites': {
                'type': 'whites',
                'length': 5,
                'default': ' ',
                'pad_content': ' ',
                'pad_direction': 'right',
                'required': False,
                'start': 224,
                'end': 229,
                'value': None,
            },
            'favored_message': {
                'type': 'string',
                'length': 1,
                'default': '',
                'pad_content': ' ',
                'pad_direction': 'right',
                'required': False,
                'start': 229,
                'end': 230,
                'value': None,
            },
            'occurrences': {
                'type': 'string',
                'length': 10,
                'default': '',
                'pad_content': ' ',
                'pad_direction': 'right',
                'required': False,
                'start': 230,
                'end': 240,
                'value': None,
            },
        }, TransferHeader, TransferFooter)
    
    def set_data(self, data=dict()):
        if data is not None:
            if 'agency' in data and 'account' in data and 'account_digit' in data:
                data['agency_account_digit'] = str(data['agency']) + ' ' + str(data['account']) + ' ' + str(data['account_digit'])
        
        super().set_data(data)


class SegmentANF(SegmentSection):
    def __init__(self, data=None):
        super().__init__('SegmentANF', data, {
            'bank_code': {
                'type': 'int',
                'length': 3,
                'default': 341,
                'pad_content': 0,
                'pad_direction': 'left',
                'required': True,
                'start': 0,
                'end': 3,
                'value': None,
            },
            'lot_code': {
                'type': 'int',
                'length': 4,
                'default': 0000,
                'pad_content': 0,
                'pad_direction': 'left',
                'required': False,
                'start': 3,
                'end': 7,
                'value': None,
            },
            'register_type': {
                'type': 'int',
                'length': 1,
                'default': 3,
                'pad_content': 0,
                'pad_direction': 'left',
                'required': False,
                'start': 7,
                'end': 8,
                'value': None,
            },
            'register_number': {
                'type': 'int',
                'length': 5,
                'default': 0,
                'pad_content': 0,
                'pad_direction': 'left',
                'required': True,
                'start': 8,
                'end': 13,
                'value': None,
            },
            'segment': {
                'type': 'string',
                'length': 1,
                'default': 'A',
                'pad_content': ' ',
                'pad_direction': 'left',
                'required': False,
                'start': 13,
                'end': 14,
                'value': None,
            },
            'move_type': {
                'type': 'int',
                'length': 3,
                'default': 0,
                'pad_content': 0,
                'pad_direction': 'left',
                'required': False,
                'start': 14,
                'end': 17,
                'value': None,
            },
            'move_type_zeros': {
                'type': 'zeros',
                'length': 3,
                'default': 0,
                'pad_content': 0,
                'pad_direction': 'left',
                'required': False,
                'start': 17,
                'end': 20,
                'value': None,
            },
            'favored_bank': {
                'type': 'int',
                'length': 3,
                'default': 0,
                'pad_content': 0,
                'pad_direction': 'left',
                'required': True,
                'start': 20,
                'end': 23,
                'value': None,
            },
            'agency_account_digit': {
                'type': 'string',
                'length': 20,
                'default': '',
                'pad_content': ' ',
                'pad_direction': 'right',
                'required': True,
                'start': 23,
                'end': 43,
                'value': None,
            },
            'favored_name': {
                'type': 'string',
                'length': 30,
                'default': '',
                'pad_content': ' ',
                'pad_direction': 'right',
                'required': True,
                'start': 43,
                'end': 73,
                'value': None,
            },
            'your_number': {
                'type': 'string',
                'length': 20,
                'default': '',
                'pad_content': ' ',
                'pad_direction': 'right',
                'required': True,
                'start': 73,
                'end': 93,
                'value': None,
            },
            'pay_date': {
                'type': 'date',
                'length': 8,
                'default': '',
                'pad_content': ' ',
                'pad_direction': 'right',
                'required': True,
                'start': 93,
                'end': 101,
                'value': None,
            },
            'currency_type': {
                'type': 'string',
                'length': 3,
                'default': 'REA',
                'pad_content': 0,
                'pad_direction': 'left',
                'required': False,
                'start': 101,
                'end': 104,
                'value': None,
            },
            'currency_zeros': {
                'type': 'zeros',
                'length': 15,
                'default': 0,
                'pad_content': 0,
                'pad_direction': 'left',
                'required': False,
                'start': 104,
                'end': 119,
                'value': None,
            },
            'payment_amount': {
                'type': 'float',
                'length': 15,
                'default': 0,
                'pad_content': 0,
                'pad_direction': 'left',
                'required': True,
                'start': 119,
                'end': 134,
                'value': None,
            },
            'our_number': {
                'type': 'string',
                'length': 15,
                'default': '',
                'pad_content': ' ',
                'pad_direction': 'right',
                'required': False,
                'start': 134,
                'end': 149,
                'value': None,
            },
            'our_number_whites': {
                'type': 'whites',
                'length': 5,
                'default': '',
                'pad_content': ' ',
                'pad_direction': 'right',
                'required': False,
                'start': 149,
                'end': 154,
                'value': None,
            },
            'effective_pay_date': {
                'type': 'date',
                'length': 8,
                'default': '',
                'pad_content': ' ',
                'pad_direction': 'right',
                'required': False,
                'start': 154,
                'end': 162,
                'value': None,
            },
            'effective_paid_amount': {
                'type': 'float',
                'length': 15,
                'default': 0,
                'pad_content': 0,
                'pad_direction': 'left',
                'required': False,
                'start': 162,
                'end': 177,
                'value': None,
            },
            'nf_document': {
                'type': 'int',
                'length': 14,
                'default': 0,
                'pad_content': 0,
                'pad_direction': 'left',
                'required': True,
                'start': 177,
                'end': 191,
                'value': None,
            },
            'nf_document_whites': {
                'type': 'whites',
                'length': 6,
                'default': '',
                'pad_content': ' ',
                'pad_direction': 'right',
                'required': False,
                'start': 191,
                'end': 197,
                'value': None,
            },
            'payment_document_number': { # doc/ted/io/cheque return number
                'type': 'int',
                'length': 6,
                'default': 0,
                'pad_content': 0,
                'pad_direction': 'left',
                'required': False,
                'start': 197,
                'end': 203,
                'value': None,
            },
            'favored_document_number': {
                'type': 'int',
                'length': 14,
                'default': 0,
                'pad_content': 0,
                'pad_direction': 'left',
                'required': True,
                'start': 203,
                'end': 217,
                'value': None,
            },
            'identify_type': {
                'type': 'int',
                'length': 1,
                'default': 2,
                'pad_content': 0,
                'pad_direction': 'left',
                'required': True,
                'start': 217,
                'end': 218,
                'value': None,
            },
            'identify_type_whites': {
                'type': 'whites',
                'length': 11,
                'default': '',
                'pad_content': ' ',
                'pad_direction': 'right',
                'required': False,
                'start': 218,
                'end': 229,
                'value': None,
            },
            'favored_message': {
                'type': 'string',
                'length': 1,
                'default': '',
                'pad_content': ' ',
                'pad_direction': 'right',
                'required': False,
                'start': 229,
                'end': 230,
                'value': None,
            },
            'occurrences': {
                'type': 'string',
                'length': 10,
                'default': '',
                'pad_content': ' ',
                'pad_direction': 'right',
                'required': False,
                'start': 230,
                'end': 240,
                'value': None,
            },
        }, TransferHeader, TransferFooter)
    
    def set_data(self, data=dict()):
        if data is not None:
            if 'agency' in data and 'account' in data and 'account_digit' in data:
                data['agency_account_digit'] = str(data['agency']) + ' ' + str(data['account']) + ' ' + str(data['account_digit'])
        
        super().set_data(data)
