package com.bizofficer.api.zoom;

import java.security.Key;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.UUID;

import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.util.UriComponentsBuilder;

import com.bizofficer.util.system.General;

import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.security.Keys;

@Service
public class AZoomMeetingUtils {

	String zoomUserId="naveen.available@gmail.com";
	String zoomApiKey="xjKnIcx0Sr2aeM9Rigdzfg";
	String zoomApiSecret="Nlkwhe7htfhR3wdJeRIbFdwn71eCs9Qi44wI";

	public ZoomMeetingObjectDTO createMeeting(ZoomBean objBean) {
	        
			General gen = new General();
			System.out.println("Request to create a Zoom meeting");
			
	       // replace zoomUserId with your user ID
	        String apiUrl = "https://api.zoom.us/v2/users/" + zoomUserId + "/meetings";
	       
	        ZoomMeetingObjectDTO zoomMeetingObjectDTO = new ZoomMeetingObjectDTO();
	        
	      // replace with your password or method
	        zoomMeetingObjectDTO.setPassword("Di@qd"+gen.getRandomNumber(1010, 9910));
	      // replace email with your email
	        zoomMeetingObjectDTO.setHost_email("yourEmail");
	        
	        zoomMeetingObjectDTO.setAgenda(objBean.getAgenda());
	        
	        MeetingInviteesDTO meetInvObj = null; 
	        List<MeetingInviteesDTO> meetingInvitees = new ArrayList<MeetingInviteesDTO>();
	        
	        meetInvObj = new MeetingInviteesDTO();
	        meetInvObj.setEmail("hello@gmail.com");
	        meetingInvitees.add(meetInvObj);
	        
	        meetInvObj = new MeetingInviteesDTO();
	        meetInvObj.setEmail("ramesh.piwania@gmail.com");
	        meetingInvitees.add(meetInvObj);
	        
//	        zoomMeetingObjectDTO.setMeeting_invitees(meetingInvitees);

	      // Optional Settings for host and participant related options
	        ZoomMeetingSettingsDTO settingsDTO = new ZoomMeetingSettingsDTO();
	        settingsDTO.setJoin_before_host(false);
	        settingsDTO.setParticipant_video(true);
	        settingsDTO.setHost_video(false);
	        settingsDTO.setAuto_recording("cloud");
	        settingsDTO.setMute_upon_entry(true);
	        
	        settingsDTO.setMeeting_invitees(meetingInvitees);
	        
	        zoomMeetingObjectDTO.setSettings(settingsDTO);

	        RestTemplate restTemplate = new RestTemplate();
	        HttpHeaders headers = new HttpHeaders();
	        headers.add("Authorization", "Bearer " + generateZoomJWTTOken(objBean.getStartTime(),objBean.getDuration()));
	        headers.add("content-type", "application/json");
	        HttpEntity<ZoomMeetingObjectDTO> httpEntity = new HttpEntity<ZoomMeetingObjectDTO>(zoomMeetingObjectDTO, headers);
	        ResponseEntity<ZoomMeetingObjectDTO> zEntity = restTemplate.exchange(apiUrl, HttpMethod.POST, httpEntity, ZoomMeetingObjectDTO.class);
	        if(zEntity.getStatusCodeValue() == 201) {
	        	System.out.println("Zooom meeeting response {}"+zEntity);
	            return zEntity.getBody();
	        } else {
	        	System.out.println("Error while creating zoom meeting {}"+ zEntity.getStatusCode());
	        }
	        return zoomMeetingObjectDTO;
	    }


	    /**
	     * Generate JWT token for Zoom using api credentials
	     * 
	     * @return JWT Token String
	     */
	    private String generateZoomJWTTOken(Date startTime, Integer duration) {
	        String id = UUID.randomUUID().toString().replace("-", "");
	        SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;

	        Date creation = new Date(startTime.getTime());
	        Date tokenExpiry = new Date(startTime.getTime() + (1000 * 60 * duration));

	        Key key = Keys
	            .hmacShaKeyFor(zoomApiSecret.getBytes());
	        return Jwts.builder()
	            .setId(id)
	            .setIssuer(zoomApiKey)
	            .setIssuedAt(creation)
	            .setSubject("")
	            .setExpiration(tokenExpiry)
	            .signWith(key, signatureAlgorithm)
	            .compact();
	    }
	    
	    private String generateZoomJWTTOken() {
	        String id = UUID.randomUUID().toString().replace("-", "");
	        SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;

	        Date creation = new Date(System.currentTimeMillis());
	        Date tokenExpiry = new Date(System.currentTimeMillis() + (1000 * 60));

	        Key key = Keys
	            .hmacShaKeyFor(zoomApiSecret.getBytes());
	        return Jwts.builder()
	            .setId(id)
	            .setIssuer(zoomApiKey)
	            .setIssuedAt(creation)
	            .setSubject("")
	            .setExpiration(tokenExpiry)
	            .signWith(key, signatureAlgorithm)
	            .compact();
	    }
	    
	    /**
	     * Request to list all meetings by userId/email of the user
	     * 
	     * @param userIdOrEmail optional userId/email value
	     * 
	     * @param meetingType scheduled/live/upcoming
	     * 
	     * @return zoomMeetingsListResponseDTO the dto containing list of meetings
	     */
	    
	    public ZoomMeetingsListResponseDTO listMeetings(String userIdOrEmail, String meetingType) {
	    	System.out.println("Request to list all Zoom meetings by User id or email {}" + userIdOrEmail);
	        // replace me with user id in case, listing meetings for a different user than admin
	        String listMeetingUrl = "https://api.zoom.us/v2/users/me/meetings";
	        // replace either user Id or email here with your user id/email
	        if(userIdOrEmail!=null) {
	            listMeetingUrl = "https://api.zoom.us/v2/users/"+ userIdOrEmail +"/meetings";
	        }
	        RestTemplate restTemplate = new RestTemplate();
	        HttpHeaders headers = new HttpHeaders();
	        headers.add("Authorization", "Bearer " + generateZoomJWTTOken());
	        headers.add("content-type", "application/json");
	        HttpEntity<?> requestEntity = new HttpEntity<>(headers);
	        UriComponentsBuilder urlBuilder = UriComponentsBuilder.fromHttpUrl(listMeetingUrl);
	        if(meetingType!=null) {
	            urlBuilder.queryParam("type", meetingType);
	        }
	        ResponseEntity<ZoomMeetingsListResponseDTO> response = restTemplate
	            .exchange(urlBuilder.toUriString(), HttpMethod.GET, requestEntity, ZoomMeetingsListResponseDTO.class);
	        if(response.getStatusCodeValue() == 200) {
	            return response.getBody();
	        } else if (response.getStatusCodeValue() == 404) {
	            ///throw new InternalServerException("User id or email not found for supplied value");
	        }
	        return null;
	    }


	    /**
	     * Generate JWT token for Zoom using api credentials
	     * 
	     * @return JWT Token String
	     */
//	    private String generateZoomJWTTOken() {
//	        String id = UUID.randomUUID().toString().replace("-", "");
//	        SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
//
//	        Date creation = new Date(System.currentTimeMillis());
//	        Date tokenExpiry = new Date(System.currentTimeMillis() + (1000 * 60));
//
//	        Key key = Keys
//	            .hmacShaKeyFor(zoomApiSecret.getBytes());
//	        return Jwts.builder()
//	            .setId(id)
//	            .setIssuer(zoomApiKey)
//	            .setIssuedAt(creation)
//	            .setSubject("")
//	            .setExpiration(tokenExpiry)
//	            .signWith(key, signatureAlgorithm)
//	            .compact();
//	    }
	    
	    
	    /**
	     * Get ZoomMeeting by Meeting id
	     * 
	     * @param meetingId the id of meetting from Zoom
	     * @return the meetingObjectDTO with meeting details
	     */
	   
	    public ZoomMeetingObjectDTO getZoomMeetingById(String meetingId) {
	    	System.out.println("Request to get single meeting by id {}" + meetingId);
	        String getMeetingUrl = "https://api.zoom.us/v2/meetings/" + meetingId;
	        System.out.println("Meeting Url {}"+getMeetingUrl);
	        RestTemplate restTemplate = new RestTemplate();
	        HttpHeaders headers = new HttpHeaders();
	        headers.add("Authorization", "Bearer " + generateZoomJWTTOken());
	        headers.add("content-type", "application/json");
	        HttpEntity<?> requestEntity = new HttpEntity<>(headers);
	        ResponseEntity<ZoomMeetingObjectDTO> zoomEntityRes =  restTemplate
	            .exchange(getMeetingUrl, HttpMethod.GET, requestEntity, ZoomMeetingObjectDTO.class);
	        if(zoomEntityRes.getStatusCodeValue() == 200) {
	                return zoomEntityRes.getBody();
	        } else if (zoomEntityRes.getStatusCodeValue() == 404) {
	                ///throw new InternalServerException("User id or email not found for supplied value");
	        }
	        return null;
	    }
	    
	    //https://api.zoom.us/v2/meetings/{meetingId}/registrants
	    public ZoomRegistrantDTO addRegistrantToZoomMeeting(String meetingId) {
	    	System.out.println("Request to get single meeting by id {}" + meetingId);
	        String apiUrl = "https://api.zoom.us/v2/meetings/" + meetingId+"/registrants";
	        System.out.println("Meeting Url {}"+apiUrl);
	        RestTemplate restTemplate = new RestTemplate();
	        HttpHeaders headers = new HttpHeaders();
	        headers.add("Authorization", "Bearer " + generateZoomJWTTOken());
	        headers.add("content-type", "application/json");
	        ////HttpEntity<?> requestEntity = new HttpEntity<>(headers);
	        
	        ZoomRegistrantDTO zoomRegistrantDTO = new ZoomRegistrantDTO();
	        zoomRegistrantDTO.setFirst_name("Sonu");
	        zoomRegistrantDTO.setEmail("hellosonudear@gmail.com");
	        
	        
	        HttpEntity<ZoomRegistrantDTO> httpEntity = new HttpEntity<ZoomRegistrantDTO>(zoomRegistrantDTO, headers);
	        ResponseEntity<ZoomRegistrantDTO> zEntity = restTemplate.exchange(apiUrl, HttpMethod.POST, httpEntity, ZoomRegistrantDTO.class);
	        if(zEntity.getStatusCodeValue() == 201) {
	        	System.out.println("Zooom meeeting response {}"+zEntity);
	            return zEntity.getBody();
	        } else {
	        	System.out.println("Error while creating zoom meeting {}"+ zEntity.getStatusCode());
	        }
	        
//	        ResponseEntity<ZoomMeetingObjectDTO> zoomEntityRes =  restTemplate
//	            .exchange(getMeetingUrl, HttpMethod.GET, requestEntity, ZoomMeetingObjectDTO.class);
//	        if(zoomEntityRes.getStatusCodeValue() == 200) {
//	                return zoomEntityRes.getBody();
//	        } else if (zoomEntityRes.getStatusCodeValue() == 404) {
//	                ///throw new InternalServerException("User id or email not found for supplied value");
//	        }
	        return null;
	    }
	    
	    /**
	     * Generate JWT token for Zoom using api credentials
	     * 
	     * @return JWT Token String
	     */
	    
//	    private String generateZoomJWTTOken() {
//	        String id = UUID.randomUUID().toString().replace("-", "");
//	        SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
//
//	        Date creation = new Date(System.currentTimeMillis());
//	        Date tokenExpiry = new Date(System.currentTimeMillis() + (1000 * 60));
//
//	        Key key = Keys
//	            .hmacShaKeyFor(zoomApiSecret.getBytes());
//	        return Jwts.builder()
//	            .setId(id)
//	            .setIssuer(zoomApiKey)
//	            .setIssuedAt(creation)
//	            .setSubject("")
//	            .setExpiration(tokenExpiry)
//	            .signWith(key, signatureAlgorithm)
//	            .compact();
//	    }
	    
	
}
