from datetime import datetime
from sqlalchemy import Column,Integer,String,Text,DateTime,ForeignKey,Numeric,UniqueConstraint,Boolean
from sqlalchemy.orm import declarative_base,relationship
Base=declarative_base()
def now(): return datetime.utcnow()
class User(Base):
 __tablename__='users';id=Column(Integer,primary_key=True);email=Column(String(190),unique=True,nullable=False);password_hash=Column(String(255),nullable=False);role=Column(String(30),default='viewer');active=Column(Boolean,default=True)
class Cluster(Base):
 __tablename__='clusters';id=Column(Integer,primary_key=True);code=Column(String(10),unique=True);name=Column(String(100))
class Site(Base):
 __tablename__='sites';id=Column(Integer,primary_key=True);site_key=Column(String(32),unique=True,nullable=False);name=Column(String(200),nullable=False);cluster_id=Column(Integer,ForeignKey('clusters.id'),nullable=False);state=Column(String(100));district=Column(String(100));latitude=Column(Numeric(11,7));longitude=Column(Numeric(11,7));tower_height=Column(Integer);power_type=Column(String(30));backhaul=Column(String(40));status=Column(String(40),default='PLANNING');notes=Column(Text);created_at=Column(DateTime,default=now);cluster=relationship('Cluster')
class Company(Base):
 __tablename__='companies';id=Column(Integer,primary_key=True);name=Column(String(200),nullable=False);registration_no=Column(String(100));contact=Column(String(150));email=Column(String(190));phone=Column(String(50));category=Column(String(100))
class Network(Base):
 __tablename__='networks';id=Column(Integer,primary_key=True);code=Column(String(10),unique=True);name=Column(String(180));boq_reference=Column(String(80))
class Task(Base):
 __tablename__='tasks';id=Column(Integer,primary_key=True);network_id=Column(Integer,ForeignKey('networks.id'));title=Column(String(240));network=relationship('Network')
class Assignment(Base):
 __tablename__='assignments';id=Column(Integer,primary_key=True);site_id=Column(Integer,ForeignKey('sites.id'));task_id=Column(Integer,ForeignKey('tasks.id'));company_id=Column(Integer,ForeignKey('companies.id'),nullable=True);status=Column(String(40),default='NOT_STARTED');progress=Column(Integer,default=0);contract_value=Column(Numeric(15,2),default=0);remarks=Column(Text);site=relationship('Site');task=relationship('Task');company=relationship('Company');__table_args__=(UniqueConstraint('site_id','task_id'),)
class BoqItem(Base):
 __tablename__='boq_items';id=Column(Integer,primary_key=True);site_id=Column(Integer,ForeignKey('sites.id'));section=Column(String(20));item_code=Column(String(80));description=Column(Text);unit=Column(String(30));quantity=Column(Numeric(15,3),default=0);unit_rate=Column(Numeric(15,2),default=0);scope=Column(String(30),default='MANDATORY');approved=Column(Boolean,default=False);site=relationship('Site')
class Document(Base):
 __tablename__='documents';id=Column(Integer,primary_key=True);site_id=Column(Integer,ForeignKey('sites.id'));category=Column(String(50));filename=Column(String(255));storage_name=Column(String(255));version=Column(String(30),default='1');uploaded_by=Column(Integer,ForeignKey('users.id'));created_at=Column(DateTime,default=now)
class Audit(Base):
 __tablename__='audit_logs';id=Column(Integer,primary_key=True);user_id=Column(Integer);action=Column(String(100));entity=Column(String(60));entity_id=Column(Integer);details=Column(Text);created_at=Column(DateTime,default=now)
