/*
 * Copyright (C) 2008,2009  OMRON SOFTWARE Co., Ltd.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include "nj_lib.h"
#include "nj_err.h"
#include "nj_ext.h"
#include "nj_dic.h"



static NJ_INT16 set_previous_selection(NJ_CLASS *iwnn, NJ_RESULT *result);
static NJ_INT16 set_learn_word_info(NJ_CLASS *iwnn, NJ_LEARN_WORD_INFO *lword, NJ_RESULT *result);



NJ_EXTERN NJ_INT16 njx_select(NJ_CLASS *iwnn, NJ_RESULT *r_result) {
    NJ_INT16 ret;
    NJ_DIC_SET *dics;


    if (iwnn == NULL) {
        
        return NJ_SET_ERR_VAL(NJ_FUNC_NJ_SELECT, NJ_ERR_PARAM_ENV_NULL);
    }
    dics = &(iwnn->dic_set);

    if (dics->rHandle[NJ_MODE_TYPE_HENKAN] == NULL) {
        return NJ_SET_ERR_VAL(NJ_FUNC_NJ_SELECT, NJ_ERR_NO_RULEDIC);
    }

    
    if ( r_result != NULL ) {
        
        ret = set_previous_selection(iwnn, r_result);
        if (ret < 0) {
            return ret; 
        }
    } else {
        
        set_previous_selection(iwnn, NULL);
    }
    return 0;   
}

NJ_EXTERN NJ_INT16 njx_init(NJ_CLASS *iwnn) {

    if (iwnn == NULL) {
        
        return NJ_SET_ERR_VAL(NJ_FUNC_NJ_INIT, NJ_ERR_PARAM_ENV_NULL);
    }

    
    set_previous_selection(iwnn, NULL);
    return 0;
}

NJ_EXTERN NJ_INT16 njx_get_candidate(NJ_CLASS *iwnn, NJ_RESULT *result, NJ_CHAR *buf, NJ_UINT16 buf_size) {
    NJ_INT16 ret;


    if (iwnn == NULL) {
        
        return NJ_SET_ERR_VAL(NJ_FUNC_NJ_GET_CANDIDATE, NJ_ERR_PARAM_ENV_NULL);
    }
    if (result == NULL) {
        return NJ_SET_ERR_VAL(NJ_FUNC_NJ_GET_CANDIDATE, NJ_ERR_PARAM_RESULT_NULL);
    }

    if ((buf == NULL) || (buf_size == 0)) {
        return NJ_SET_ERR_VAL(NJ_FUNC_NJ_GET_CANDIDATE, NJ_ERR_BUFFER_NOT_ENOUGH);
    }

    switch (NJ_GET_RESULT_OP(result->operation_id)) {
    case NJ_OP_SEARCH:
        ret = njd_get_candidate(iwnn, result, buf, buf_size);
        break;

    default:
        
        ret = NJ_SET_ERR_VAL(NJ_FUNC_NJ_GET_CANDIDATE, NJ_ERR_INVALID_RESULT); 
        break;
    }
    
    return ret;
}

NJ_EXTERN NJ_INT16 njx_get_stroke(NJ_CLASS *iwnn, NJ_RESULT *result, NJ_CHAR *buf, NJ_UINT16 buf_size) {
    NJ_INT16 ret;


    if (iwnn == NULL) {
        
        return NJ_SET_ERR_VAL(NJ_FUNC_NJ_GET_STROKE, NJ_ERR_PARAM_ENV_NULL);
    }
    if (result == NULL) {
        return NJ_SET_ERR_VAL(NJ_FUNC_NJ_GET_STROKE, NJ_ERR_PARAM_RESULT_NULL);
    }

    if ((buf == NULL) || (buf_size == 0)) {
        return NJ_SET_ERR_VAL(NJ_FUNC_NJ_GET_STROKE, NJ_ERR_BUFFER_NOT_ENOUGH);
    }

    switch (NJ_GET_RESULT_OP(result->operation_id)) {
    case NJ_OP_SEARCH:
        ret = njd_get_stroke(iwnn, result, buf, buf_size);
        break;

    default:
        
        ret = NJ_SET_ERR_VAL(NJ_FUNC_NJ_GET_STROKE, NJ_ERR_INVALID_RESULT); 
        break;
    }
    return ret;
}


static NJ_INT16 set_previous_selection(NJ_CLASS *iwnn, NJ_RESULT *result) {
    NJ_INT16   ret;
    NJ_PREVIOUS_SELECTION_INFO *prev_info = &(iwnn->previous_selection);


    if (result == NULL) {
        prev_info->count = 0;
   } else {
        ret = set_learn_word_info(iwnn, &(prev_info->selection_data), result);
        if (ret < 0) {
            
            return ret; 
        }

        prev_info->count = 1;
    }
    
    return 0;
}

static NJ_INT16 set_learn_word_info(NJ_CLASS *iwnn, NJ_LEARN_WORD_INFO *lword, NJ_RESULT *result) 
{
    NJ_INT16 ret;
    NJ_DIC_SET *dics = &(iwnn->dic_set);



#if 0
    
    ret = njx_get_stroke(iwnn, result, lword->yomi, sizeof(lword->yomi));
    if (ret < 0) {
        return ret; 
    }
    lword->yomi_len = (NJ_UINT8)ret;
    ret = njx_get_candidate(iwnn, result, lword->hyouki, sizeof(lword->hyouki));
    if (ret < 0) {
        return ret; 
    }
    lword->hyouki_len = (NJ_UINT8)ret;
#else
    lword->yomi[0] = 0x0000;
    lword->yomi_len = 0;
    lword->hyouki[0] = 0x0000;
    lword->hyouki_len = 0;
#endif

    
    lword->f_hinsi = NJ_GET_FPOS_FROM_STEM(&(result->word));
    lword->stem_b_hinsi = NJ_GET_BPOS_FROM_STEM(&(result->word));
    lword->b_hinsi = NJ_GET_BPOS_FROM_STEM(&(result->word));

    
    ret = njd_r_get_hinsi(dics->rHandle[NJ_MODE_TYPE_HENKAN], NJ_HINSI_TANKANJI_F);
    if ((ret != 0) && (lword->f_hinsi == (NJ_UINT16)ret)) {
        ret = njd_r_get_hinsi(dics->rHandle[NJ_MODE_TYPE_HENKAN], NJ_HINSI_CHIMEI_F);
        if (ret != 0) {
            lword->f_hinsi = (NJ_UINT16)ret;
        }
    }

    
    ret = njd_r_get_hinsi(dics->rHandle[NJ_MODE_TYPE_HENKAN], NJ_HINSI_TANKANJI_B);
    if ((ret != 0) && (lword->b_hinsi == (NJ_UINT16)ret)) {
        ret = njd_r_get_hinsi(dics->rHandle[NJ_MODE_TYPE_HENKAN], NJ_HINSI_CHIMEI_B);
        if (ret != 0) {
            lword->b_hinsi = (NJ_UINT16)ret;
        }
    }

    
    ret = njd_r_get_hinsi(dics->rHandle[NJ_MODE_TYPE_HENKAN], NJ_HINSI_TANKANJI_B);
    if ((ret != 0) && (lword->stem_b_hinsi == (NJ_UINT16)ret)) {
        ret = njd_r_get_hinsi(dics->rHandle[NJ_MODE_TYPE_HENKAN], NJ_HINSI_CHIMEI_B);
        if (ret != 0) {
            lword->stem_b_hinsi = (NJ_UINT16)ret;
        }
    }

    return 0;

}