package com.numberplate.numberplateserver.controller;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.google.gson.JsonArray;
import com.numberplate.numberplateserver.entity.Picture;
import com.numberplate.numberplateserver.entity.Plate;
import com.numberplate.numberplateserver.repository.PictureRepository;
import com.numberplate.numberplateserver.repository.PlateRepository;
import com.numberplate.numberplateserver.api.Base64Util;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.web.bind.annotation.*;

import java.io.File;
import java.io.FileWriter;
import kong.unirest.Unirest;
import kong.unirest.HttpResponse;

import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.List;

@RestController
@RequestMapping("/picture")
public class PictureHandler {
    @Autowired
    private PictureRepository pictureRepository;

    @Autowired
    private PlateRepository plateRepository;

    @GetMapping("/findAll/{page}/{size}")
    public Page<Picture> findAll(@PathVariable("page") Integer page, @PathVariable("size") Integer size){
        Pageable pageable = PageRequest.of(page-1,size);
        return pictureRepository.findAll(pageable);
    }

    @PostMapping("/save")
    public String save(@RequestBody Picture picture){
//        List<Picture> result = pictureRepository.findByUrl(picture.getUrl());
//        if(result.size()!=0) return "图片地址已存在";
        String token = "9df08649ebdd49846a9a5b0d3ba67c946df19e73";
        String base64 = Base64Util.GetImageStrFromUrl(picture.getUrl());
//        String base64 = Base64Util.GetImageStrFromUrl("https://pic4.zhimg.com/80/v2-b379de996c2e84e76e43de4d98298c8e_qhd.jpg");

        try {
            //根据图片地址生成base64编码，发送到车牌识别api进行识别
            HttpResponse<String> response = Unirest.post("https://api.platerecognizer.com/v1/plate-reader/")
                    .header("Authorization", "Token "+token)
                    .field("upload", base64)
                    .asString();
            if(response.isSuccess()){
                JSONObject data = JSONObject.parseObject(response.getBody().toString());
                JSONArray results = (JSONArray)data.get("results");
                JSONObject result = (JSONObject)results.get(0);
                //获取api返回的车牌号和分数，并根据分数进行分类
                float score = Float.parseFloat(result.get("score").toString());
                String plate = result.get("plate").toString();
                System.out.println(score);
                System.out.println(result.toString());
                if(score >= 0.8){
                    //根据车牌号查找数据库，如果已经存在，则识别次数加一
                    List<Plate> existplates = plateRepository.findByNumber(plate);
                    if(existplates.size()!=0){
                        Plate oldplate = existplates.get(0);
                        oldplate.setCount(oldplate.getCount()+1);
                        Plate updateres = plateRepository.save(oldplate);
                        if(updateres != null){
                            return "success";
                        }else {
                            return "error";
                        }
                    }
                    //这个车牌号未被识别，存入Recognizable Vehicle表里
                    Plate plate1 = new Plate();
                    plate1.setNumber(plate);
                    plate1.setUrl(picture.getUrl());
                    plate1.setCount(1);
                    Plate res = plateRepository.save(plate1);
                    if(res != null){
                        return "success";
                    }else {
                        return "error";
                    }
                }
                else if(score<0.8 && score >= 0.5){
                    //根据图片地址查找数据库，如果已经存在，则不操作，否则将其存入Unrecognized Vehicle
                    List<Picture> existpic = pictureRepository.findByUrl(picture.getUrl());
                    if(existpic.size()==0){
                        Picture res = pictureRepository.save(picture);
                        if (res != null) {
                            return "success";
                        }else{
                            return "error";
                        }
                    }else{
                        return "picture already exists";
                    }

                }
            }
            return response.getBody().toString();
        }
        catch(Exception e) {
            System.out.println(e);
            return e.toString();
        }
    }

    @PutMapping("/update")
    public String update(@RequestBody Picture picture){
        Picture result = pictureRepository.save(picture);
        if(result !=null){
            return "success";
        }else{
            return "error";
        }
    }

    @DeleteMapping("/deleteById/{id}")
    public void deleteById(@PathVariable("id") Integer id){
        pictureRepository.deleteById(id);
    }
}
