"""
Database Models for OCR Application
"""

from datetime import datetime
from database import db


class KTPRecord(db.Model):
    """Model untuk menyimpan data KTP hasil OCR"""
    __tablename__ = 'ktp_records'
    
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    nik = db.Column(db.String(16), unique=True, nullable=True, index=True)
    nama = db.Column(db.String(100), nullable=True)
    tempat_lahir = db.Column(db.String(50), nullable=True)
    tanggal_lahir = db.Column(db.String(20), nullable=True)
    jenis_kelamin = db.Column(db.String(20), nullable=True)
    gol_darah = db.Column(db.String(5), nullable=True)
    alamat = db.Column(db.Text, nullable=True)
    rt_rw = db.Column(db.String(10), nullable=True)
    kel_desa = db.Column(db.String(50), nullable=True)
    kecamatan = db.Column(db.String(50), nullable=True)
    kabupaten_kota = db.Column(db.String(50), nullable=True)
    provinsi = db.Column(db.String(50), nullable=True)
    agama = db.Column(db.String(20), nullable=True)
    status_perkawinan = db.Column(db.String(30), nullable=True)
    pekerjaan = db.Column(db.String(50), nullable=True)
    kewarganegaraan = db.Column(db.String(10), nullable=True)
    berlaku_hingga = db.Column(db.String(20), nullable=True)
    image_path = db.Column(db.String(255), nullable=True)  # Path to saved KTP image
    raw_text = db.Column(db.Text, nullable=True)
    created_at = db.Column(db.DateTime, default=datetime.utcnow)
    updated_at = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
    
    def to_dict(self):
        """Convert model to dictionary"""
        return {
            'id': self.id,
            'nik': self.nik,
            'nama': self.nama,
            'tempat_lahir': self.tempat_lahir,
            'tanggal_lahir': self.tanggal_lahir,
            'jenis_kelamin': self.jenis_kelamin,
            'gol_darah': self.gol_darah,
            'alamat': self.alamat,
            'rt_rw': self.rt_rw,
            'kel_desa': self.kel_desa,
            'kecamatan': self.kecamatan,
            'kabupaten_kota': self.kabupaten_kota,
            'provinsi': self.provinsi,
            'agama': self.agama,
            'status_perkawinan': self.status_perkawinan,
            'pekerjaan': self.pekerjaan,
            'kewarganegaraan': self.kewarganegaraan,
            'berlaku_hingga': self.berlaku_hingga,
            'image_path': self.image_path,
            'created_at': self.created_at.isoformat() if self.created_at else None,
            'updated_at': self.updated_at.isoformat() if self.updated_at else None
        }
    
    @classmethod
    def from_ocr_data(cls, ocr_data, raw_text=None):
        """Create KTPRecord from OCR extracted data"""
        return cls(
            nik=ocr_data.get('nik'),
            nama=ocr_data.get('nama'),
            tempat_lahir=ocr_data.get('tempat_lahir'),
            tanggal_lahir=ocr_data.get('tanggal_lahir'),
            jenis_kelamin=ocr_data.get('jenis_kelamin'),
            gol_darah=ocr_data.get('gol_darah'),
            alamat=ocr_data.get('alamat'),
            rt_rw=ocr_data.get('rt_rw'),
            kel_desa=ocr_data.get('kel_desa'),
            kecamatan=ocr_data.get('kecamatan'),
            kabupaten_kota=ocr_data.get('kabupaten_kota'),
            provinsi=ocr_data.get('provinsi'),
            agama=ocr_data.get('agama'),
            status_perkawinan=ocr_data.get('status_perkawinan'),
            pekerjaan=ocr_data.get('pekerjaan'),
            kewarganegaraan=ocr_data.get('kewarganegaraan'),
            berlaku_hingga=ocr_data.get('berlaku_hingga'),
            raw_text=raw_text
        )


class KKRecord(db.Model):
    """Model untuk menyimpan data Kartu Keluarga hasil OCR"""
    __tablename__ = 'kk_records'
    
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    no_kk = db.Column(db.String(16), unique=True, nullable=True, index=True)
    kepala_keluarga = db.Column(db.String(100), nullable=True)
    alamat = db.Column(db.Text, nullable=True)
    rt_rw = db.Column(db.String(10), nullable=True)
    kel_desa = db.Column(db.String(50), nullable=True)
    kecamatan = db.Column(db.String(50), nullable=True)
    kabupaten_kota = db.Column(db.String(50), nullable=True)
    provinsi = db.Column(db.String(50), nullable=True)
    kode_pos = db.Column(db.String(10), nullable=True)
    image_path = db.Column(db.String(255), nullable=True)  # Path to saved KK image
    raw_text = db.Column(db.Text, nullable=True)
    created_at = db.Column(db.DateTime, default=datetime.utcnow)
    updated_at = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
    
    def to_dict(self):
        """Convert model to dictionary"""
        return {
            'id': self.id,
            'no_kk': self.no_kk,
            'kepala_keluarga': self.kepala_keluarga,
            'alamat': self.alamat,
            'rt_rw': self.rt_rw,
            'kel_desa': self.kel_desa,
            'kecamatan': self.kecamatan,
            'kabupaten_kota': self.kabupaten_kota,
            'provinsi': self.provinsi,
            'kode_pos': self.kode_pos,
            'image_path': self.image_path,
            'created_at': self.created_at.isoformat() if self.created_at else None,
            'updated_at': self.updated_at.isoformat() if self.updated_at else None
        }
    
    @classmethod
    def from_ocr_data(cls, ocr_data, raw_text=None):
        """Create KKRecord from OCR extracted data"""
        return cls(
            no_kk=ocr_data.get('no_kk'),
            kepala_keluarga=ocr_data.get('kepala_keluarga'),
            alamat=ocr_data.get('alamat'),
            rt_rw=ocr_data.get('rt_rw'),
            kel_desa=ocr_data.get('kel_desa'),
            kecamatan=ocr_data.get('kecamatan'),
            kabupaten_kota=ocr_data.get('kabupaten_kota'),
            provinsi=ocr_data.get('provinsi'),
            kode_pos=ocr_data.get('kode_pos'),
            raw_text=raw_text
        )
