from __future__ import absolute_import
from flask_sqlalchemy.query import Query as BaseQuery
from dostadmin import db
from dostadmin.mixins import TimestampMixin


class RegistrationQuery(BaseQuery):
    def get_by_id(self, registration_id):
        return self.filter(Registration.id == registration_id).first()

    def get_by_user_id(self, user_id):
        return self.filter(Registration.user_id == user_id).first()

    def get_by_user_phone(self, phone):
        return self.filter(Registration.phone.contains(phone[-10:])).first()


class Registration(TimestampMixin, db.Model):
    __tablename__ = "registration"
    query_class = RegistrationQuery

    class SignupStatus:
        COMPLETE = "complete"
        INCOMPLETE = "incomplete"

    class OnboardingSource:
        MISSED_CALL_REGISTERED = "missed_call"
        UI_REGISTERED = "ui"

    id = db.Column(db.Integer, primary_key=True)
    user_id = db.Column(db.Integer, db.ForeignKey("users.id"))
    partner_id = db.Column(db.Integer, db.ForeignKey("partner.id"))
    phone = db.Column(db.String(50), unique=True)
    provider_number = db.Column(db.String(50), unique=False)
    program_id = db.Column(db.Integer, db.ForeignKey("program.id"))
    signup_status = db.Column(db.String(50), unique=False)
    time_category_id = db.Column(db.Integer, db.ForeignKey("timecategory.id"))
    district = db.Column(db.String(100), unique=False)
    centre = db.Column(db.String(100), unique=False)
    block = db.Column(db.String(100), unique=False)
    sector = db.Column(db.String(100), unique=False)
    state = db.Column(db.String(100), unique=False)
    onboarding_source = db.Column(db.String(100), unique=False)
    onboarded_by = db.Column(db.String(100), unique=False)
    parent_type = db.Column(db.String(100), unique=False)
    is_child_between_0_3 = db.Column(db.Boolean)
    is_child_between_3_6 = db.Column(db.Boolean)
    is_child_above_6 = db.Column(db.Boolean)
    has_no_child = db.Column(db.Boolean)
    has_smartphone = db.Column(db.Boolean)
    has_dropped_missedcall = db.Column(db.Boolean)
    has_received_callback = db.Column(db.Boolean)
    education_level = db.Column(db.String(100), unique=False)
    occupation = db.Column(db.String(100), unique=False)
    gender_of_child = db.Column(db.String(100), unique=False)
    number_of_eligible_kids = db.Column(db.String(100), unique=False)
    village = db.Column(db.String(100), unique=False)
    is_alumni_user = db.Column(db.Boolean)
    cluster = db.Column(db.String(100), unique=False)

    user = db.relationship(
        "User",
        back_populates="registration",
    )

    @classmethod
    def update_program_id(cls, registration, program_id):
        registration.program_id = program_id
        db.session.commit()

    @classmethod
    def update_time_category_id(cls, registration, time_category_id):
        registration.time_category_id = time_category_id
        db.session.commit()

    @classmethod
    def delete_registration_for_phone(cls, user_phone):
        try:
            registration_data = cls.query.filter_by(phone=user_phone).first()
            registration_id = registration_data.id
            db.session.delete(registration_data)
            db.session.commit()
            return registration_id
        except Exception as e:
            return str(e)
