from sqlalchemy import Column, Enum, Integer, String, DateTime, Boolean, ForeignKey
from sqlalchemy.orm import relationship
from webgds import app, db
from datetime import datetime
from flask_login import UserMixin
from enum import Enum as RoleEnum


class UserRole(RoleEnum):
    USER = 1
    ADMIN = 2

class BaseModel(db.Model):
    __abstract__ = True
    id = Column(Integer, primary_key=True, autoincrement=True)



class User(BaseModel, UserMixin):
    username = Column(String(50), unique=True)
    password = Column(String(50))
    user_role = Column(Enum(UserRole), default=UserRole.USER)

    def __str__(self):
        return self.name


class Category(BaseModel):
    __tablename__ = 'category'

    name = Column(String(30), nullable=False)
    projects = relationship('Project', backref='category', lazy=True)

    def __str__(self):
        return self.name

class Project(BaseModel):
    __tablename__ = 'project'

    name = Column(String(50), nullable=False)
    description = Column(String(255))
    image = Column(String(100))
    link = Column(String(255))
    active = Column(Boolean, default=True)
    created_date = Column(DateTime, default=datetime.now())
    category_id = Column(Integer, ForeignKey(Category.id), nullable=False)
    project_tag = relationship('ProjectTag', backref='project', lazy=True)
    project_images = relationship('ProjectImage', backref='project', lazy=True)

    def __str__(self):
        return self.name

class Tag(BaseModel):
    __tablename__ = 'tag'

    name = Column(String(50))
    project_tag = relationship('ProjectTag', backref='tag', lazy=True)
    def __str__(self):
        return self.name

class ProjectTag(BaseModel):
    __tablename__ = 'project_tag'
    tag_id = Column(Integer, ForeignKey(Tag.id), nullable=False)
    project_id = Column(Integer, ForeignKey(Project.id), nullable=False)


class ProjectImage(BaseModel):
    __tablename__ = 'project_image'

    image = Column(String(100))
    project_id = Column(Integer, ForeignKey(Project.id), nullable=False)




class About(BaseModel):
    __tablename__ = 'about'

    address = Column(String(100))
    phone = Column(String(20))
    email = Column(String(50))
    name = Column(String(50))
    desctiption = Column(String(255))
    facebook = Column(String(100),  nullable=True)
    youtube = Column(String(100), nullable=True)

    def __str__(self):
        return self.name


class Contact(BaseModel):
    __tablename__ = 'contact'

    username = Column(String(50))
    email = Column(String(50))
    phone = Column(String(20), nullable=False)
    message = Column(String(255))

    def __str__(self):
        return self.phone


class Subscriber(BaseModel):
    __tablename__ = 'subscriber'

    email = Column(String(50), unique=True, nullable=False)

    def __str__(self):
        return self.email


class Team(BaseModel):
    __tablename__ = 'team'

    name = Column(String(30))
    position = Column(String(20))
    phone = Column(String(20))
    email = Column(String(50))
    facebook = Column(String(70))
    avatar = Column(String(50))
    def __str__(self):
        return self.name


class Service(BaseModel):
    __tablename__ = 'service'

    name = Column(String(50))
    image = Column(String(100))
    desctiption = Column(String(255))

    def __str__(self):
        return self.name



if __name__ == "__main__":
    with app.app_context():
        db.create_all()





