# -*- coding:utf-8 -*-

from api.extensions import db
from api.lib.database import Model, TimestampMixin, SoftDeleteMixin, CRUDMixin


class ModelWithoutPK(db.Model, TimestampMixin, SoftDeleteMixin, CRUDMixin):
    __table_args__ = {"extend_existing": True}
    __abstract__ = True


class Department(ModelWithoutPK):
    __tablename__ = 'common_department'
    department_id = db.Column(db.Integer, primary_key=True, autoincrement=True)

    department_name = db.Column(db.VARCHAR(255), default='')
    department_director_id = db.Column(
        db.Integer, default=0)
    department_parent_id = db.Column(db.Integer, default=1)

    sort_value = db.Column(db.Integer, default=0)

    acl_rid = db.Column(db.Integer, default=0)


class Employee(ModelWithoutPK):
    __tablename__ = 'common_employee'
    employee_id = db.Column(db.Integer, primary_key=True, autoincrement=True)

    email = db.Column(db.VARCHAR(255), default='')
    username = db.Column(db.VARCHAR(255), default='')
    nickname = db.Column(db.VARCHAR(255), default='')
    sex = db.Column(db.VARCHAR(64), default='')
    position_name = db.Column(db.VARCHAR(255), default='')
    mobile = db.Column(db.VARCHAR(255), default='')
    avatar = db.Column(db.VARCHAR(255), default='')

    direct_supervisor_id = db.Column(db.Integer, default=0)

    department_id = db.Column(db.Integer,
                              db.ForeignKey('common_department.department_id')
                              )

    acl_uid = db.Column(db.Integer, default=0)
    acl_rid = db.Column(db.Integer, default=0)
    acl_virtual_rid = db.Column(db.Integer, default=0)
    last_login = db.Column(db.TIMESTAMP, nullable=True)
    block = db.Column(db.Integer, default=0)

    notice_info = db.Column(db.JSON, default={})

    _department = db.relationship(
        'Department', backref='common_employee.department_id',
        lazy='joined'
    )


class EmployeeInfo(Model):
    __tablename__ = 'common_employee_info'

    info = db.Column(db.JSON, default={})
    employee_id = db.Column(db.Integer, db.ForeignKey(
        'common_employee.employee_id'))
    employee = db.relationship(
        'Employee', backref='common_employee.employee_id', lazy='joined')


class CompanyInfo(Model):
    __tablename__ = "common_company_info_json"

    info = db.Column(db.JSON)


class InternalMessage(Model):
    __tablename__ = "common_internal_message"

    title = db.Column(db.VARCHAR(255), nullable=True)
    content = db.Column(db.TEXT, nullable=True)
    path = db.Column(db.VARCHAR(255), nullable=True)
    is_read = db.Column(db.Boolean, default=False)
    app_name = db.Column(db.VARCHAR(128), nullable=False)
    category = db.Column(db.VARCHAR(128), nullable=False)
    message_data = db.Column(db.JSON, nullable=True)
    employee_id = db.Column(db.Integer, db.ForeignKey('common_employee.employee_id'), comment='ID')


class CommonData(Model):
    __table_name__ = 'common_data'

    data_type = db.Column(db.VARCHAR(255), default='')
    data = db.Column(db.JSON)


class NoticeConfig(Model):
    __tablename__ = "common_notice_config"

    platform = db.Column(db.VARCHAR(255), nullable=False)
    info = db.Column(db.JSON)


class CommonFile(Model):
    __tablename__ = 'common_file'

    file_name = db.Column(db.VARCHAR(512), nullable=False, index=True)
    origin_name = db.Column(db.VARCHAR(512), nullable=False)
    binary = db.Column(db.LargeBinary(16777216), nullable=False)