import sys
import json
import pytesseract
from PIL import Image
import re
import os

pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'

def extract_info(image_path):
    try:
        if not os.path.exists(image_path):
            return {"error": f"Python: File not found: {image_path}"}
        
        img = Image.open(image_path).convert('L')
        text = pytesseract.image_to_string(img, config='--psm 6')
        
        data = {
            "student_name": "", 
            "date_of_birth": "", 
            "father_name": "", 
            "gender": "", 
            "address": ""
        }
        
        lines = [line.strip() for line in text.split('\n') if line.strip()]
        
        if not lines:
            return {"error": "Tesseract read blank page."}

        full_text = ' '.join(lines).lower()

        # DOB
        for pattern in [r'(\d{2}/\d{2}/\d{4})', r'(\d{2}-\d{2}-\d{4})']:
            match = re.search(pattern, text)
            if match:
                data["date_of_birth"] = match.group(1)
                break

        # Gender
        if "female" in full_text or "महिला" in full_text: 
            data["gender"] = "Female"
        elif "male" in full_text or "पुरुष" in full_text: 
            data["gender"] = "Male"

        # Name (before DOB line)
        for i, line in enumerate(lines):
            if any(x in line.lower() for x in ["dob", "जन्म", "birth"]):
                for j in range(1, 4):
                    if i - j >= 0:
                        potential = lines[i - j]
                        if (len(potential) > 3 and 
                            "government" not in potential.lower() and 
                            "india" not in potential.lower() and
                            not re.match(r'^\d', potential)):
                            data["student_name"] = potential
                            break
                break
        
        if not data["student_name"] and len(lines) > 1:
            for line in lines[1:]:
                if len(line) > 3 and "government" not in line.lower():
                    data["student_name"] = line
                    break

        # Father Name
        for i, line in enumerate(lines):
            if any(x in line.lower() for x in ["father", "पिता", "s/o", "d/o"]):
                if ":" in line:
                    parts = line.split(":", 1)
                    if len(parts) > 1 and parts[1].strip():
                        data["father_name"] = parts[1].strip()
                elif i + 1 < len(lines):
                    data["father_name"] = lines[i + 1]
                break

        # Address
        for i, line in enumerate(lines):
            if "address" in line.lower() or "पता" in line.lower():
                addr_lines = []
                for j in range(1, 4):
                    if i + j < len(lines):
                        if any(kw in lines[i+j].lower() for kw in ["mobile", "phone", "pin"]):
                            break
                        addr_lines.append(lines[i+j])
                if addr_lines:
                    data["address"] = ", ".join(addr_lines)
                break

        return data
        
    except Exception as e:
        import traceback
        return {"error": str(e), "traceback": traceback.format_exc()}

if __name__ == "__main__":
    if len(sys.argv) > 1:
        print(json.dumps(extract_info(sys.argv[1]), ensure_ascii=False))
    else:
        print(json.dumps({"error": "No image path provided"}))