import csv
import codecs
from flask_sqlalchemy.query import Query as BaseQuery
from dostadmin import db
from dostadmin.mixins import TimestampMixin


class MessageQuery(BaseQuery):
    def get_sms_with_id(self, content_id):
        return self.filter(Message.id == content_id).first()

    def get_sms_log(self):
        return self.all()

    def find_message_with_name(self, sms_name):
        sms = self.filter(Message.name == sms_name).first()
        if sms:
            return sms
        return None


class Message(TimestampMixin, db.Model):
    __tablename__ = "message"
    query_class = MessageQuery

    class Type:
        WHATSAPP = "WA"
        SMS = "SMS"

        CHOICE = ((WHATSAPP, "WhatsApp"), (SMS, "SMS"))

    class MessageType:
        TEXT = "text"
        IMAGE = "image"
        VIDEO = "video"
        AUDIO = "audio"
        DOCUMENT = "document"

        CHOICE = (
            (TEXT, "Text"),
            (IMAGE, "Image"),
            (VIDEO, "Video"),
            (AUDIO, "Audio"),
            (DOCUMENT, "Document"),
        )

        MEDIA_TYPES = [IMAGE, VIDEO, AUDIO, DOCUMENT]

    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(100), unique=True)
    message = db.Column(db.String(3000))
    appid = db.Column(db.Integer)
    type = db.Column(db.String(20))
    message_type = db.Column(db.String(20))
    media_id = db.Column(db.String(1000))

    campaigns = db.relationship(
        "MessageCampaign",
        backref="message",
        primaryjoin="Message.id == MessageCampaign.message_id",
    )

    def __repr__(self):
        return "Sms_" + str(self.id) + " " + self.name + " " + self.message

    @classmethod
    def add_to_message_table(
        cls,
        message_name,
        message_body,
        message_type,
        appid=None,
        message_category=MessageType.TEXT,
    ):
        message_rec = Message(
            name=message_name,
            message=message_body,
            type=message_type,
            appid=appid,
            message_type=message_category,
        )
        db.session.add(message_rec)
        db.session.commit()

    @classmethod
    def bulk_message_upload(cls, data_file):
        csv_reader = csv.DictReader(codecs.iterdecode(data_file, "utf-8"))
        err_list = []
        for row in csv_reader:
            message_name = row["name"]
            message_text = row["message_text"]
            try:
                Message.add_to_message_table(
                    message_name=message_name,
                    message_body=message_text,
                    message_type=Message.Type.WHATSAPP,
                    message_category=Message.MessageType.TEXT,
                )
            except Exception as err:
                err_list.append(err)
        return err_list
