from datetime import datetime
from routes.v1 import db

from .types import Registrationtype, Residence, Gender, Households, TimestampMixin


class MembershipLevel(db.Model, TimestampMixin):
	__table_name = 'membership_levels'
	id = db.Column(db.Integer, primary_key=True)
	public_id = db.Column(db.String(255), nullable=False, index=True, unique=True)
	name = db.Column(db.String(255), nullable=False)
	prefix = db.Column(db.String(10), unique=True, nullable=False)

	def serialize(self):
		return{
			'name' : self.name,
			'public_id' : self.public_id,
			'prefix' : self.prefix
		}

class Member(db.Model, TimestampMixin):
	__table_name = 'members'
	id = db.Column(db.Integer, primary_key=True)
	public_id = db.Column(db.String(255), nullable=False, index=True, unique=True)
	membershipid = db.Column(db.String(50), nullable=False, index=True, unique=True)
	registration_type = db.Column(db.String(255), nullable=False, index=True)
	residence = db.Column(db.String(255), db.ForeignKey('residence.public_id'), nullable=False, index=True)
	title = db.Column(db.String(10), nullable=True)
	first_name = db.Column(db.String(60), nullable=False)
	sur_name = db.Column(db.String(60), nullable=False)
	gender = db.Column(db.String(255), nullable=False, index=True)
	dob = db.Column(db.DateTime, nullable=False)
	id_alien_number = db.Column(db.String(50), nullable=False, index=True)
	postal_address = db.Column(db.String(150), nullable=False, index=True)
	postal_code = db.Column(db.String(100), nullable=False, index=True)
	email = db.Column(db.String(200), nullable=False, index=True)
	tel_number = db.Column(db.String(50), nullable=False, index=True)
	household_type = db.Column(db.String(255), db.ForeignKey('households.public_id'), nullable=True, index=True)
	member_level = db.Column(db.String(255),nullable=False, index=True)
	member_setting = db.Column(db.String(100), nullable=False, index=True)
	profile_image = db.Column(db.String(255), nullable=True)
	expiry_date = db.Column(db.DateTime, nullable=True)
	payment_status = db.Column(db.Integer, nullable=True)
	salesforce_account_id = db.Column(db.String(100), nullable=True)
	salesforce_flag = db.Column(db.Integer, nullable=True)
	salesforce_uuid = db.Column(db.String(100), nullable=True)
	contact_uuid = db.Column(db.String(100), nullable=True)
	payment_method = db.Column(db.String(100), nullable=True)
	payment_date = db.Column(db.DateTime, nullable=True)
	promo_code = db.Column(db.String(100), nullable=True)
	mpesa_txn_code = db.Column(db.String(100), nullable=True)
	membership_status = db.Column(db.Integer, nullable=True)
	

	def to_json(self):
		return {
			'public_id': self.public_id,
			'membership_id' : self.membershipID,
			'member_class' : self.member_level,
			'first_name': self.first_name,
			'sur_name' : self.sur_name,
			'gender' : self.gender,
			'dob' : self.dob,
			'registration_type' : self.registration_type,
			'member_setting' : self.member_setting,
			'id_alien_number' : self.id_alien_number,
			'title' : self.title,
			'postal_address' : self.postal_address,
			'postal_code' : self.postal_code,
			'email' : self.email,
			'tel_number' : self.tel_number,
			'household_type' : self.household_type,
			'status': self.status,
			'image' : self.profile_image,
			'payment_status' : self.payment_status,
			'expiry_date' : self.expiry_date,
			'salesforce_flag' : self.salesforce_flag,
			'salesforce_uuid' : self.salesforce_uuid,
			'payment_method' : self.payment_method,
			'payment_date' : self.payment_date,
			'promo_code' : self.promo_code,
			'mpesa_txn_code' : self.mpesa_txn_code,
			'membership_status':self.membership_status,
		}

class Corporate(db.Model, TimestampMixin):
	id = db.Column(db.Integer, primary_key=True)
	public_id = db.Column(db.String(100), nullable=False, unique=True, index=True)
	member_id = db.Column(db.String(100), nullable=False, index=True)
	company_name = db.Column(db.String(100), nullable=False, index=True)
	email = db.Column(db.String(100), nullable=False, index=True)
	email1 = db.Column(db.String(100), nullable=True, index=True)
	email2 = db.Column(db.String(100), nullable=True, index=True)
	phone_number = db.Column(db.String(100), nullable=False, index=True)
	contact_person_name = db.Column(db.String(100), nullable=False, index=True)
	contact_person_phone_number = db.Column(db.String(100), nullable=False, index=True)
	salesforce_uuid = db.Column(db.String(100))
	salesforce_account_uuid = db.Column(db.String(100))
	salesforce_contact_uuid = db.Column(db.String(100))
	postal_address = db.Column(db.String(100))
	postal_code = db.Column(db.String(100))
	expiry_date = db.Column(db.DateTime)
	amount = db.Column(db.Integer)
	payment_method = db.Column(db.String(100))
	payment_status = db.Column(db.Integer)
	town = db.Column(db.String(100))
	code = db.Column(db.String(10))
	country = db.Column(db.String(100))
	visits = db.Column(db.Integer)
	vehicles = db.Column(db.Integer)
	passengers = db.Column(db.Integer)

	def to_json(self):
		return {
			'public_id' : self.public_id,
			'memberID' : self.member_id,
			'company_name' : self.company_name,
			'email' : self.email,
			'email1' : self.email1,
			'email2' : self.email2,
			'phone_number' : self.phone_number,
			'contact_person_name' : self.contact_person_name,
			'contact_person_phone_number' : self.contact_person_phone_number,
			'salesforce_uuid' : self.salesforce_uuid,
			'salesforce_account_uuid' : self.salesforce_account_uuid,
			'salesforce_contact_uuid' : self.salesforce_contact_uuid,
			'postal_address' : self.postal_address,
			'postal_code' : self.postal_code,
			'expiry_date' : self.expiry_date,
			'payment_status' : self.payment_status,
			'payment_method' : self.payment_method,
			'code' : self.code,
			'town' : self.town,
			'country' : self.country,
			'amount' : self.amount,
			'passengers' : self.passengers,
			'visits' : self.visits,
			'vehicles' : self.vehicles,
			'corporate' : True
		}

class FamilyType(db.Model, TimestampMixin):
	id = db.Column(db.Integer, primary_key=True)
	name = db.Column(db.String(100), nullable=False)
	public_id = db.Column(db.String(100), nullable=False, index=True, unique=True)
	descrption = db.Column(db.Text, nullable=True)
	ages = db.Column(db.String(100), nullable=False)

	def serialize(self):
		return {
			'name' : self.name,
			'description': self.description,
			'public_id' : self.public_id,
			'ages' : self.ages
		}

class FamilyMember(db.Model, TimestampMixin):
	id = db.Column(db.Integer, primary_key=True)
	public_id = db.Column(db.String(100), nullable=False, unique=True, index=True)
	family_type = db.Column(db.String(100), nullable=False, index=True)
	membership_id = db.Column(db.String(100), nullable=False, index=True)
	first_name = db.Column(db.String(60), nullable=False)
	sur_name = db.Column(db.String(60), nullable=False)
	title = db.Column(db.String(10), nullable=True)
	gender = db.Column(db.String(255), nullable=False, index=True)
	dob = db.Column(db.DateTime, nullable=False)
	id_alien_number = db.Column(db.String(50), nullable=True, index=True)
	postal_address = db.Column(db.String(150), nullable=True, index=True)
	postal_code = db.Column(db.String(100), nullable=True, index=True)
	email = db.Column(db.String(200), nullable=True, index=True)
	tel_number = db.Column(db.String(50), nullable=True, index=True)
	salesforce_flag = db.Column(db.Integer, nullable=True)
	salesforce_account_id = db.Column(db.String(100), nullable=True)

	def serialize(self):
		return {
			'public_id': self.public_id,
			'first_name': self.first_name,
			'sur_name' : self.sur_name,
			'gender' : self.gender,
			'dob' : self.dob,
			'id_alien_number' : self.id_alien_number,
			'title' : self.title,
			'postal_address' : self.postal_address,
			'postal_code' : self.postal_code,
			'email' : self.email,
			'tel_number' : self.tel_number,
			'status': self.status,
			'expiry_date' : self.expiry_date,
			'salesforce_flag' : self.salesforce_flag,
			'membership_id' : self.membership_id
		}


class Transaction(db.Model, TimestampMixin):
	__tablename__ = 'transactions'
	id = db.Column(db.Integer, primary_key=True)
	public_id = db.Column(db.String(100), nullable=False, unique=True, index=True)
	member_id = db.Column(db.String(255), nullable=False, index=True)
	transaction_date = db.Column(db.DateTime)
	phone_number = db.Column(db.String(100))
	mpesa_reference = db.Column(db.String(100))
	card_first_four = db.Column(db.String(10))
	card_last_four = db.Column(db.String(10))
	currency = db.Column(db.String(100), index=True)
	amount_paid = db.Column(db.Float(10,2))
	currency_buying_rate_at_time = db.Column(db.Float(10,2))
	currency_selling_rate_at_time = db.Column(db.Float(10,2))
	session_id = db.Column(db.String(100))