from datetime import datetime
import pytz


class ShopifyCustomer:
    def __init__(self, firstname, lastname, email, phone, note, tax_exempt):
        self._firstname = firstname
        self._lastname = lastname
        self._email = email
        self._phone = phone
        self._note = note
        self._marketing = False
        self._tax_exempt = tax_exempt
        self._tags = []
        self._addresses = []
        self._metafields = []

    # Getters
    @property
    def firstname(self):
        return self._firstname

    @property
    def lastname(self):
        return self._lastname

    @property
    def email(self):
        return self._email

    @property
    def phone(self):
        return self._phone

    @property
    def note(self):
        return self._note

    @property
    def tags(self):
        return self._tags

    @property
    def addresses(self):
        return self._addresses

    @property
    def metafields(self):
        return self._metafields

    def add_tag(self, tag):
        if tag not in self._tags:
            self._tags.append(tag)
    # Setters
    @firstname.setter
    def firstname(self, firstname):
        self._firstname = firstname

    @lastname.setter
    def lastname(self, lastname):
        self._lastname = lastname

    @email.setter
    def email(self, email):
        self._email = email

    @phone.setter
    def phone(self, phone):
        self._phone = phone

    @note.setter
    def note(self, note):
        self._note = note

    def set_marketing(self):
        self._marketing = True

    # Functions
    def _tag_exists(self, search_tag):
        return search_tag in self._tags

    def add_tag(self, tag):
        if not self._tag_exists(tag):
            self._tags.append(tag)

    def add_addresses(self, company, name, firstname, lastname, address1, address2, address3, zip_code, city, country, phone, default=True):
        for address in self._addresses:
            if (
                address["company"] == company and
                address["name"] == name and
                address["first_name"] == firstname and
                address["last_name"] == lastname and
                address["address1"] == address1 and
                address["address2"] == address2 and
                address["address3"] == address3 and
                address["zip"] == zip_code and
                address["city"] == city and
                address["country"] == country and
                address["phone"] == phone and
                address["default"] == default
            ):
                return

        self._addresses.append({
            "company": company,
            "name": name,
            "first_name": firstname,
            "last_name": lastname,
            "address1": address1,
            "address2": address2,
            "zip": zip_code,
            "city": city,
            "country": country,
            "phone": phone,
            "default": bool(default)
        })

    def add_metafield(self, namespace, key, value, field_type="single_line_text_field"):
        for metafield in self._metafields:
            if metafield['namespace'] == namespace and metafield["key"] == key:
                return

        self._metafields.append({
            "namespace": namespace,
            "key": key,
            "value": value,
            "type": field_type
        })

    def add_id_metafield_customer(self, key, namespace, metafield_id):
        for metafield in self._metafields:
            if metafield["namespace"] == namespace and metafield["key"] == key:
                metafield["id"] = int(metafield_id)
                break

    def create_array(self, customer_id=None):
        paris_zone = pytz.timezone('Europe/Paris')
        paris_time = datetime.now(paris_zone)

        data = {
            "customer": {
                "customer_id": customer_id,
                "first_name": self._firstname,
                "last_name": self._lastname,
                "email": self._email,
                "phone": self._phone,
                "verified_email": True,
                "send_email_welcome": False,
                "tags": self._tags,
                "send_email_invite": False,
                "note": self._note,
                "addresses": self._addresses,
                "metafields": self._metafields,
                "tax_exempt": self._tax_exempt
            }
        }

        if self._marketing:
            data['customer']['email_marketing_consent'] = {
                "state": "subscribed",
                "opt_in_level": "single_opt_in",
                "consent_updated_at": paris_time.isoformat()
            }

        return data

    mapping = {
        "Code client": "client_code",
        "Société": "company",
        "Devise": "currency",
        "Profil de TVA": "vat_profile",
        "Actif": "active",
        "Civilité": "title",
        "Contact Nom": "contact_last_name",
        "Contact Prénom": "contact_first_name",
        "Adresse 1": "address_line1",
        "Adresse 2": "address_line2",
        "Adresse 3": "address_line3",
        "Code Postal": "postal_code",
        "Ville": "city",
        "Pays": "country",
        "Téléphone": "phone",
        "Portable": "mobile",
        "Mail": "email",
        "N° T.V.A. intra.": "vat_number",
        "Activité": "activity",
        "Branche": "branch",
        "Catégorie": "category",
        "Assujetti à la TVA ?": "subject_to_vat",
        "Mode de règlement": "payment_method",
        "Rib IBAN": "iban",
        "Rib BIC": "bic",
        "Liv Société": "delivery_company",
        "Liv Adresse 1": "delivery_address_line1",
        "Liv Adresse 2": "delivery_address_line2",
        "Liv Adresse 3": "delivery_address_line3",
        "Liv Code Postal": "delivery_postal_code",
        "Liv Ville": "delivery_city",
        "Liv Pays": "delivery_country",
        "Liv Téléphone": "delivery_phone",
        "Liv Portable": "delivery_mobile",
        "Liv Nom": "delivery_last_name",
        "Liv Prénom": "delivery_first_name",
        "B to B": "b2b"
    }