package test;

import java.io.IOException;
import java.text.ParseException;
import java.util.ArrayList;

import org.apache.commons.lang.StringEscapeUtils;
import org.json.JSONObject;

import arabi.tools.verbs.analysis.Verb;
import arabi.tools.verbs.analysis.VerbsConjugation;
import arabi.tools.verbs.awzan.PossibleWazan;
import arabi.tools.verbs.lemma.LemmaExtractor;
import arabi.tools.verbs.stem.StemmerExtractor;
import arabi.tools.verbs.support.Pronouns;
import arabi.tools.verbs.synonyms.SynonymsExtractor;
import arabi.tools.verbs.tashkeel.PossibleVerbTashkeel;

public class VerbsToolsTester {

	public static void main(String[] args) throws IOException, ParseException {
	
     	        //example1();
  		//example2();
 		//example3();
		//example4();
		//example5();
		//example6();
		//example7();
		//example8();
		//example9();

	}
	
	//مثال ١: برنامج يستخرج المصدر لكلمة
	public static void example1() throws IOException, ParseException {
		
		// الكلمة المدخلة مثال : يدرسون
		String word = "يدرسون";
				
		// بناء كائن من نوع مستخلص أصل الكلمة (أو ما اخذت منه)
		LemmaExtractor le = new LemmaExtractor();
				
		// إرجاع قائمة بالنتائج بعد مناداة العملية البرمجية الخاصة باسترجاع أصل الكلمة 
		ArrayList<String> res = le.getLemma(word);
			    
		// طباعة النتائج على الشاشة
		System.out.println(res);
	}

	//مثال ٢: برنامج يعمل على إستخراج جذر كلمة
	public static void example2() throws IOException, ParseException {
		// الكلمة المدخلة مثال : البطولية
		String word = "البطولية";
				
		// بناء كائن من نوع مستخرج الجذور
		StemmerExtractor sm = new StemmerExtractor();
			   
		//إستخراج جذر الكلمة
		ArrayList<String>res = sm.getStem(word);
			   
		// طباعة الجذر
		System.out.println(res);
	}

	//مثال ٣: قطعة برنامج تعمل على ارجاع معلومات مهيكلة عن تصريف مُدخل معين
	public static void example3() throws IOException, ParseException  {
		// الفعل المُدخل للتحليل
		String input_verb = "سألتمونيها";
				
		// بناء كائن من نظام التحليل الصرفي
		VerbsConjugation vc = new VerbsConjugation();
				
		//  استخراج التحليل الصرفية وفي حال كان هنالك اكثر من احتمالية للفعل فتعود جميع الاحتمالات
		ArrayList<Verb> verbs = vc.getVerbConj(input_verb);
				
		// استخراج معلومات الفعل مهيكلة
		JSONObject structured_result = verbs.get(0).generateJSONFormat();
				
		// تحويل المعلومات المهيكلة الى نص لتسهيل عملية طباعته 
		String  structured_result_txt = StringEscapeUtils.unescapeJava(structured_result.toString());
				
		// طباعة النتائج
		System.out.println(structured_result_txt);
	}

	
	//مثال ٤: ارجاع اسم الفاعل واسم المفعول لفعل معين
	public static void example4() throws IOException, ParseException {
		// الفعل المُدخل للتحليل
		String input_verb = "يقرأون";
				
		// بناء كائن من نظام التحليل الصرفي
		VerbsConjugation vc = new VerbsConjugation();
				
		//  استخراج التحليل الصرفية وفي حال كان هنالك اكثر من احتمالية للفعل فتعود جميع الاحتمالات
		ArrayList<Verb> verbs = vc.getVerbConj(input_verb);
				
		// استخرج اسم الفاعل واطبعه على الشاشة
		String participles_active = verbs.get(0).getParticiples_active();
		System.out.println("اسم الفاعل: "+participles_active);

		// استخرج اسم المفعول واطبعه على الشاشة
		String participles_passive = verbs.get(0).getParticiples_passive();
		System.out.println("اسم المفعول: "+participles_passive);
	}

	
	//مثال ٥: ارجاع التصريف لفعل ما في المضارع والماضي المبنيان للمعلوم مع الضمير - هو
    public static void example5() throws IOException, ParseException {
     	        // الفعل المُدخل للتحليل
     	        String input_verb = "يبتكرون";
    			
                // بناء كائن من نظام التحليل الصرفي
                VerbsConjugation vc = new VerbsConjugation();
    			
                //  استخراج التحليل الصرفية وفي حال كان هنالك اكثر من احتمالية للفعل فتعود جميع الاحتمالات
                ArrayList<Verb>verbs = vc.getVerbConj(input_verb);
    			
     	 	    // ارجاع الماضي مع الضمير هو للفعل المُدخل
     	        String past_tense_howa = verbs.get(0).getPast_active(Pronouns.howa);
     	        System.out.println("الماضي مع الضمير هو : "+past_tense_howa);

     	        // ارجاع المضارع مع الضمير هو للفعل المُدخل
     	        String present_tense_howa = verbs.get(0).getPresent_tense(Pronouns.howa);
     	        System.out.println("المضارع مع الضمير هو :"+present_tense_howa);
    }

    //مثال ٦: ارجاع التصريف لفعل ما في المضارع المنصوب المبني للمجهول و الأمر مع الضمير - أنتِ
    public static void example6() throws IOException, ParseException {
		
		// الفعل المُدخل للتحليل
		String input_verb = "تسديد";
				
		// بناء كائن من نظام التحليل الصرفي
		VerbsConjugation vc = new VerbsConjugation();
				
		//  استخراج التحليل الصرفية وفي حال كان هنالك اكثر من احتمالية للفعل فتعود جميع الاحتمالات
		ArrayList<Verb>verbs = vc.getVerbConj(input_verb);
				
		// ارجاع الماضي مع الضمير أنت للفعل المُدخل
		String passive_present_ind = verbs.get(0).getPassive_present_tense_indicative(Pronouns.anti);
		System.out.println("المضارع المنصوب المبني للمجهول مع الضمير أنتِ: "+passive_present_ind);

		// ارجاع الأمر مع الضمير أنتِ للفعل المُدخل
		String imperative_tense = verbs.get(0).getImperative_tense(Pronouns.anti);
		System.out.println("فعل الأمر مع الضمير أنتِ: "+imperative_tense);
	}

    //مثال ٧: قطعة برنامج تبني التشكيلات المختلفة للفعل
    public static void example7() throws IOException {
     	        // الفعل المُدخل للتشكيل
     	        String verb  = "يجمعون";
    			
     	       //بناء كائن من فئة التشكيلات المحتملة
     	       PossibleVerbTashkeel pt = new PossibleVerbTashkeel();
    			
     	       // ايجاد قائمة التشكيلات
     	       ArrayList<String> res = pt.getPossibleVerbTashkeel(verb);
     			
     	       // طباعة النتيجة
     	       System.out.println(res);
    }
    
    //مثال ٨: قطعة برنامج لإستخراج الوزن الصرفي
    public static void example8() throws IOException, ParseException {
     	       // الفعل المُدخل لإيجاد الوزن الصرفي
     	       String word = "استنباط";
    			
     	       // بناء كائن من فئة الميزان الصرفي
     	       PossibleWazan wa = new PossibleWazan();
    		    
    	       // ايجاد الوزن بدون ومع تشكيل
    	       ArrayList<String> res = wa.getPossibleVerbWazen(word);
    		   
      	       // طباعة النتيجة
     	       System.out.println(res);
    }
    
    //مثال ٩: قطعة برنامج لإيجاد الكلمات ذات العلاقة
    public static void example9() throws IOException, ParseException {
     	       // الكلمة المُدخلة
     	       String word = "حكايات";
    			
     	       // بناء كائن من فئة ايجاد المرادفات والكلمات ذات العلاقة
     	       SynonymsExtractor sy = new SynonymsExtractor();
    		   
     	       // ايجاد النتائج وتخزينها في قائمة
     	       ArrayList<String> res =  sy.getSynonyms(word);
    		   
     	       // طباعة النتائج
     	       System.out.println(res);

    }
    
}